2013-01-04 75 views
2

我努力讓我的頭周圍發生了什麼,在下面的例子中的列表發生的事情:列表的創建和對象初始

創作 dataOjb
public class DataObject 
{ 
    public List<object> SomeObjects { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     var dataObj = new DataObject() 
          { 
           SomeObjects = { new object() }, 
          }; 

     Console.ReadKey(); 
    } 
} 

因爲SomeObjects屬性尚未實例化明顯失敗。我假設沒有編譯錯誤,因爲DataObject可能有一個構造函數實例化SomeObjects。鑑於此,如果我試圖做這樣的事情:

List<int> SomeObjects; 
SomeObjects = {1, 2, 3, 4}; 

這顯然是行不通的,而且也不:

List<int> SomeObjects = new List<int>(); 
SomeObjects = {1, 2, 3, 4}; 

所以去我的實際問題,什麼調用的是第一個對象初始值設定項(我試過查找它並找不到它),爲什麼它的行爲不同,還有其他地方可以使用它嗎?

+0

向下選民,原因是什麼?這似乎並不具有建設性,我怎麼知道我的問題出了什麼問題? –

回答

7

所以讓我實際的問題,什麼是所謂的第一對象初始化

這相當於代碼:

var tmp = new DataObject(); 
tmp.SomeObjects.Add(new object()); 
var dataObj = tmp; 

(並且由於第二線失敗tmp.SomeObjects顯然是空的。)

This = { ... } syntax is only適用於對象初始值設定項,這就是爲什麼您的後兩個代碼段無效。

更具體地 - 並且在說明書中的術語 - 一個構件-初始化是形式

identifier = initializer-value 

其中初始值表達對象或收集初始化程序中的一個的。這不僅適用於收藏,但...你可以設置現有成員的特性,也:

var foo = new Foo { 
    Bar = { 
     X = 2, 
     Y = 3 
    } 
}; 

這相當於:

var tmp = new Foo(); 
tmp.Bar.X = 2; 
tmp.Bar.Y = 3; 
var foo = tmp; 
+0

謝謝,喬恩。這正是我想知道的。 –