【问题标题】:What is the added value of using object initializer?使用对象初始化器的附加值是什么?
【发布时间】:2014-08-30 07:36:47
【问题描述】:

使用对象初始化器的附加价值是什么? 与引用类型相比,在值类型上使用它有什么不同吗?

我最近安装了 ReSharper,对于以下示例:

 var response = new Response(); 
 response.Value = "My value";

我的代码变成了这样:

var response = new Response()
{
   Value = "My value",
};

当初始化程序太大时,我个人发现更难遵循代码。

【问题讨论】:

  • 在您的第二个代码 sn-p 中,您可能指的是 value = ... 而不是 response.value = ...。此外,您不必为每个已初始化的属性一遍又一遍地重复response.,这一事实增加了可读性,IMO。

标签: c# resharper object-initializers


【解决方案1】:

不,在这种情况下,referencevalue 类型之间没有任何区别。

对象初始化器是在一个代码行中初始化对象的一种奇特方式,当初始化很短时。

方便在多线程期间,当您需要确保有一次执行该行时,您的对象已初始化,或者您的程序处于有效状态。

但基本上这些都归结为编码风格和个人便利。

【讨论】:

  • 在我读到你所说的多线程之前,我一直支持你。没有什么可以保证所有的初始化都会自动发生。
  • @JohnSaunders 虽然他的解释含糊不清,但他是对的。规范的第 7.6.10.2 节说,OP 的第二个代码 sn-p 将被转换为:1)实例化一个 Response 类型的新实例并将其分配给名为 __response 的临时变量,2)将属性设置为__response,3) 将引用复制到response,即response = __response。这意味着对象在所有初始化发生之前不会发布,这可能会对多线程方案产生影响。这也意味着 OP 的第一个和第二个代码 sn-ps 是不等价的。
  • @dcastro:很有趣。我不知道。所以 response 要么是 null 要么完全初始化。这仅适用于局部变量吗?运行相同代码的不同线程可以通过什么方式初始化为不同的值?
  • @JohnSaunders 这也适用于字段。如果对象是局部变量,则在设置所有属性之前不发布对象没有任何好处——这只会在response 是共享状态时产生影响。我没听懂你的第二个问题,你能改一下吗?
  • @JohnSaunders:如果您的意思是无法保证行代码将被编译,那么您是对的。在实例的内部初始化中,我可以运行 while(true) 并阻止线程。如果您知道自己在做什么,我的观点是关于“理智”的编码。如果我编写不阻塞的代码,.NET 本身会保证在该行之后您的对象实际上已被初始化。如果您认为可以更改我的帖子以更好地表达对此的想法,请随时进行编辑。
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多