var dlg = new Microsoft.Win32.OpenFileDialog
{
Title = "Select configuration",
DefaultExt = ".xml",
Filter = "XML-file (.xml)|*.xml",
CheckFileExists = true
};
我从this帖子得到了上面的内容。大括号内的部分是否通过Accessors分配值。似乎没有构造函数,因此它意味着调用默认值,然后分配属性值。
答案 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 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
时。您可以告诉它是默认构造函数,因为没有传入参数。
答案 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;