Ber*_*ial 6 c# constructor initialization
嗨,我想知道像这样初始化对象之间是否有任何区别
MyClass calass = new MyClass()
{
firstProperty = "text",
secondProperty = "text"
}
Run Code Online (Sandbox Code Playgroud)
并像这样初始化对象
MyClass calass = new MyClass // no brackets
{
firstProperty = "text",
secondProperty = "text"
}
Run Code Online (Sandbox Code Playgroud)
我也想知道这种初始化的名称是什么
Jon*_*eet 10
不,绝对没有区别.在这两种情况下,您都使用对象初始化表达式.对象初始化器在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;
Run Code Online (Sandbox Code Playgroud)
请注意分配如何calass
仅在分配属性后发生- 正如您对源代码所期望的那样.(在某些情况下,我认为C#编译器能有效地去除多余的变量,并重新安排任务,但它必须观察地表现这样的翻译.它肯定能有所作为,如果你重新分配现有的变量).
编辑:关于省略构造函数参数的轻微细微之处.如果这样做,它总是等同于包括空参数列表-但是这不一样的是相当于调用参数的构造函数.例如,可以有可选参数或参数数组:
using System;
class Test
{
int y;
Test(int x = 0)
{
Console.WriteLine(x);
}
static void Main()
{
// This is still okay, even though there's no geniune parameterless
// constructor
Test t = new Test
{
y = 10
};
}
}
Run Code Online (Sandbox Code Playgroud)