2011-05-16 50 views
2
var dlg = new Microsoft.Win32.OpenFileDialog 
{ 
    Title = "Select configuration", 
    DefaultExt = ".xml", 
    Filter = "XML-file (.xml)|*.xml", 
    CheckFileExists = true 
}; 

我从this后得到了上面的一块。大括号内的部分是通过访问器分配值的。似乎没有构造函数,所以它暗示默认的构造函数被调用,然后分配属性值。对象创建后不久通过访问器的代码设置值

回答

4

什么你已经证明被称为object initializer,介绍了C#3.0中的语法功能。

类似下面的代码,从而产生在第一行的对象,然后,单独地设定在后续行其属性:

var dlg = new Microsoft.Win32.OpenFileDialog(); 
dlg.Title = "Select configuration"; 
dlg.DefaultExt = ".xml"; 
dlg.Filter = "XML-file (.xml)|*.xml"; 
dlg.CheckFileExists = true; 

然而,不相同到上面的代码。当您使用对象初始值设定项时,编译器将创建一个临时变量,设置该临时变量中包含的对象的属性,然后将该临时变量分配给您声明的实际变量。最终的结果是创建对象实例是原子。有关更多详细信息,请参阅this questionthis blog post的答案。

在实践中,你能想象得到的代码看起来像这样,当完全展开:

var temporaryDlg = new Microsoft.Win32.OpenFileDialog(); 
temporaryDlg.Title = "Select configuration"; 
temporaryDlg.DefaultExt = ".xml"; 
temporaryDlg.Filter = "XML-file (.xml)|*.xml"; 
temporaryDlg.CheckFileExists = true; 

var dlg = temporaryDlg; 

至于你的问题有关,其构造函数被调用,是的,这是在两种情况下,默认的构造函数。第一行是对构造函数的调用,当它说new。你可以告诉它是默认的构造函数,因为没有参数传入。

1

是的,这意味着与默认构造函数创建和使用存取分配的值相同,即,其在.NET3.5或上面的语法,以支持对象的初始化

2

是的,它是相同的:

var dlg = new Microsoft.Win32.OpenFileDialog(); 

dlg.Title = "Select configuration"; 
dlg.DefaultExt = ".xml"; 
dlg.Filter = "XML-file (.xml)|*.xml"; 
dlg.CheckFileExists = true; 

它确实是你猜到的 - 调用构造函数,然后使用公共属性设置。

+3

这有点误导......它不是**完全相同。 C#中的对象初始化器是原子的,而你的例子不是。编译器创建一个临时变量,为其分配属性,然后将该临时变量分配给您声明的实际变量。更多信息是[here](http://stackoverflow.com/questions/1679780/when-using-object-initializers-why-does-the-compiler-generate-an-extra-local-var)。 – 2011-05-16 10:41:07

+2

它几乎是相同的 - 编译器实际上引入了一个新变量来接受构造对象并执行属性访问,然后在发生后为'dlg'变量赋值相同的引用。对var'(或任何局部变量)不重要,但对分配给多个线程可见的字段很重要。 – 2011-05-16 10:42:11

1

是的,这是句法糖。编译器会生成此下面的代码:

var dlg = new Microsoft.Win32.OpenFileDialog(); 
dlg.Title = "Select configuration"; 
dlg.DefaultExt = ".xml"; 
dlg.Filter = "XML-file (.xml)|*.xml"; 
dlg.CheckFileExists = true; 
+0

这是不正确的; C#中的对象初始化器不仅仅是纯粹的语法糖。看到我的评论JK的答案。 – 2011-05-16 10:41:48

+0

感谢您提供额外的深度!看起来像一个常见的误解:) – MattDavey 2011-05-16 12:16:31