在创建对象后不久,此代码是否通过访问器设置值

时间:2011-05-16 10:19:25

标签: c# .net constructor accessor object-initializers

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

我从this帖子得到了上面的内容。大括号内的部分是否通过Accessors分配值。似乎没有构造函数,因此它意味着调用默认值,然后分配属性值。

4 个答案:

答案 0 :(得分: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;

但是,与上述代码不相同。使用对象初始值设定项时,编译器将创建临时变量,在该临时变量中包含的对象上设置属性,然后将该临时变量分配给您声明的实际变量。最终结果是对象实例的创建是 atomic 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 :(得分:2)

是的,它与:

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

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

它完全符合您的猜测 - 调用构造函数,然后使用公共属性settors。

答案 2 :(得分:1)

是的,它意味着使用默认构造函数创建的i-e相同,并使用访问器来分配值,使用.net3.5或更高语法来支持对象初始化

答案 3 :(得分:1)

是的,这是语法糖。编译器将为此生成以下代码:

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