不同种类的对象初始化

时间:2011-03-01 23:04:01

标签: c# constructor initialization

您好 我想知道像这样初始化对象之间是否有任何区别

MyClass calass = new MyClass()
{
  firstProperty = "text",
  secondProperty = "text"
}

并像这样初始化对象

MyClass calass = new MyClass   // no brackets
{
  firstProperty = "text",
  secondProperty = "text"
}

我还想知道这种初始化的名称是什么

2 个答案:

答案 0 :(得分:9)

不,绝对没有区别。在这两种情况下,您都使用对象初始化表达式。对象初始化器是在C#3中引入的。

在这两种情况下,这完全等同于:

// tmp is a hidden variable, effectively. You don't get to see it.
MyClass tmp = new MyClass(); 
tmp.firstProperty = "text";
tmp.secondProperty = "text";

// This is your "real" variable
MyClass calass = tmp;

请注意,{/ 1}}的分配仅在分配了属性后才会发生 - 正如您对源代码所期望的那样。 (在某些情况下,我相信C#编译器可以有效地删除额外的变量并重新排列分配,但它必须显然表现得像这样的翻译。如果你重新分配现有的话,它肯定会有所作为。可变的。)

编辑:关于省略构造函数参数的轻微细微之处。如果你这样做,它总是等同于包含一个空参数列表 - 但是与调用无参数构造函数相同。例如,可以有可选参数或参数数组:

calass

答案 1 :(得分:2)

不。事实上,ReSharper会抱怨带有初始化程序的无参数构造函数的括号是多余的。如果您使用带有一个或多个参数的构造函数,您(显然)仍然需要它们,但是因为不是这种情况,只需删除它们。