假設,我們有一個非常簡單的類:集合初始化的怪異語法
class ObjectList {
public List<string> List1 { get; } = new List<string>();
public List<string> List2 { get; set; }
}
,我們想使這個類的一個實例:
ObjectList objectList = new ObjectList {
List1 = { "asdf", "qwer" },
List2 = new List<string> { "zxcv", "1234" }
};
所以,在列表2的情況下,好吧,使用「=」我們設置屬性。但是,在List1的情況下,它看起來像我們設置屬性,但實際上,我們假設在之前的某個位置設置它,並且在這裏我們只設置值。它和數組初始化非常相似:
string[] arr = { "val1", "val2" }
爲什麼C#在這裏使用這種混淆語法?
編輯: 我想我很困惑與C#6.0語法的觀衆,但它不是重點。讓我們使用舊的C#3.0和.net 2.0。並允許增添更多的樂趣也該增加一些值(「1」和「2」)的列表,從開始,傑夫梅爾卡多推薦:
class Program {
static void Main(string[] args) {
ObjectList objectList = new ObjectList {
List1 = { "asdf", "qwer" },
};
}
}
class ObjectList {
List<string> _List1 = new List<string>() { "1", "2" };
public List<string> List1 {
get {
return _List1;
}
}
}
它顯示了同樣怪異的語法。最後,我列出了名單{「1」,「2」,「asdf」,「qwer」},這更加令人困惑。我可以期待這一點。
編譯? List1沒有公共setter,所以你不應該在initializer語法中設置它。 –
它的確如此。編譯器實際上將該語法轉換爲調用'.Add()' –
我同意,這種語法真的很奇怪。在語義上,它更像'+ ='。嵌套對象初始化器完全一樣 - 沒有構造函數調用,初始化器只設置屬性。 –