2014-09-12 23 views
2

學習Xamarin我遇到這種使用大括號的:使用大括號與對象的構造

Label header = new Label 
{ 
    Text = "Label", 
    Font = Font.BoldSystemFontOfSize(50), 
    HorizontalOptions = LayoutOptions.Center 
}; 

我想知道怎麼能是正確的,因爲通常在C#,當我想創建一個對象實例:

Label label = new Label(); 
label.Text = "Label"; 
... 

大括號是什麼樣的用法呢?你如何創建一個沒有圓括號的對象?

+2

這是一個正常的C#3.0(或更高版本)對象初始化表達式。有關更多信息,請參閱http://msdn.microsoft.com/en-us/library/vstudio/bb738566.aspx。 – 2014-09-12 13:10:47

+0

這兩者在功能上沒有區別。 – Casey 2014-09-12 13:14:42

+1

此外,如果存在該對象的無參數構造函數(或無),則可以僅爲構造函數**省略括號。如果存在帶參數的構造函數,則可以將它們與對象初始值設定項結合使用。新的Person(「John」,「Smith」){Address =「123 Main Street」}語法也是有效的。 – ardila 2014-09-12 13:26:12

回答

4

這是一個正常的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", 
}; 

Label label = new Label(); 
label.Text = "Label"; 

在前者之間的細微差異,設置一個屬性的值時導致異常,可變header未被分配,而如後者是。原因是前者相當於:

Label temp = new Label(); 
temp.Text = "Label"; 
Label label = temp; 

正如你所看到的,如果在第二行中有一個異常,第三行永遠不會被執行。

3

這只是初始化對象屬性的一種不同的語法,稱爲object initializer syntax。作爲告訴未來開發者的一種方法「這個對象在這些屬性設置之前還沒有準備好」。

該語法是in C# 3.0的新功能之一,這可能是您不熟悉它的原因。