使用带有对象构造的花括号

nix*_*x86 3 c# curly-brackets

学习Xamarin我遇到过这种花括号的用法:

Label header = new Label
{
    Text = "Label",
    Font = Font.BoldSystemFontOfSize(50),
    HorizontalOptions = LayoutOptions.Center
};
Run Code Online (Sandbox Code Playgroud)

而且我想知道它是如何正确的,因为通常在C#中我想创建一个对象的实例:

Label label = new Label();
label.Text = "Label";
...
Run Code Online (Sandbox Code Playgroud)

这是什么样的花括号?如何创建没有圆括号的对象?

Kri*_*ten 5

这是一个普通的C#3.0(或更高版本)对象初始化表达式.有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb397680.aspxhttp://msdn.microsoft.com/en-us/library/vstudio/bb738566.aspx.

两者之间存在细微差别

Label header = new Label
{
    Text = "Label",
};
Run Code Online (Sandbox Code Playgroud)

Label label = new Label();
label.Text = "Label";
Run Code Online (Sandbox Code Playgroud)

在前者中,当设置属性的值导致异常时,header不分配变量,而后者则分配变量.原因是前者相当于:

Label temp = new Label();
temp.Text = "Label";
Label label = temp;
Run Code Online (Sandbox Code Playgroud)

如您所见,如果第二行中存在异常,则第三行永远不会被执行.