2013-01-20 55 views
5

有時是在類名後指定一個初始化列表不使用()運算符:C#初始化程序列表 - 何時在類名後面使用()運算符?

Cat cat = new Cat { Age = 10, Name = "Fluffy" } 

是()運算符後指定的其他時間:

List<Cat> cats = new List<Cat> 
    { 
     new Cat(){ Name = "Sylvester", Age=8 } 
    } 

我假設的差異因爲這裏有新的Cat()在列表中。但我仍然不明白爲什麼它應該是不同的。那麼爲什麼不同,以及何時使用哪種語法?

謝謝。

+0

[爲什麼C#3.0對象初始值設定器的構造函數括號是可選的?](http://stackoverflow.com/questions/3661025/why-are-c-sharp-3-0-object-initializer-constructor-parentheses -optional) – CharlesB

回答

6

當您使用初始化程序列表時,可以在使用無參數構造函數時省略()。新Cat()在列表中或不在列表中。

6

如果沒有默認(無參數)構造函數 - 必須提供參數時,必須指定()

當一個類具有默認構造函數(或無參數構造函數)時,在使用初始值設定項時,您總是可以省略()。編譯器爲你做了這些魔術,你可以把它看作 - 編譯器爲你插入它們。

+0

如果沒有默認構造函數()不會工作不行?我上面給出的例子是來自MSDN,那裏的Cat類沒有任何構造函數,這意味着有一個默認的。 –

+0

這個答案當前是錯誤的。你不能總是省略()。 「新貓;」將無法工作。您可以在使用初始化程序列表時省略它。 – user1908061

+0

@YechielLabunskiy - 不,它不會工作。默認的構造函數是當您不指定構造函數時生成的構造函數,也是無參數構造函數。 – Oded

0

您決定使用哪兩種方式沒有實質性區別。比較這兩個Cat實例:

var catA = new Cat(); // traditional constructor 
catA.Name = "Mittens"; // set property 

var catB = new Cat { Name = "Not Mittens" }; // all in one initializer 

它們在功能上是相同的,只是一個快捷符號。第一種方法是傳統方式,其中大多數面向對象的(OO)語言使用構造函數創建對象。 C#最近添加了這種創建對象和設置屬性的新方法,以使代碼更清晰。

即使您的班級沒有無參數構造函數(new()),您仍然可以使用{...}初始化。

考慮一下:

var dogA = new Dog("Fido"); 
var dogA.Age = 12; 

var dogB = new Dog("Not Fido") { Age = 7 }; 

即使在構造是必需的參數,您仍可以你提供他們利用這種初始化風格長。

+0

它們並不完全相同,並且有區別。閱讀http://haacked.com/archive/2013/01/11/hidden-pitfalls-with-object-initializers.aspx獲取更多信息。 :) – user1908061

相關問題