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


我从this帖子中获得了上述内容。是大括号内的部分,通过访问器分配值。似乎没有构造函数,因此是否暗示会调用默认构造函数,然后分配属性值。

最佳答案

您所显示的称为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 question的答案和this 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时。您可以说这是默认构造函数,因为没有参数传入。

10-05 20:59
查看更多