從本質上講,對象初始化器只是簡化了代碼編寫工作,後台編譯器自動完成轉換。對象初始化器實際上利用了編譯器對對象中對外可見的字段和屬性進行按序賦值,在編譯時還是隱式調用了構造函數,對字段或屬性的進行逐一賦值。如果一個類的成員又是一個類,仍舊可以用象初始化器設置更復雜的嵌套(nested)屬性類型。如把MyClass再加一個屬性:
public OClass oclassMember { get; set; }
該屬性的類的定義如下:
public class OClass
{
public string addr { get; set; }
public string zip { get; set; }
public OClass()
{
}
public OClass(string address, string zipCode)
{
this.addr = address;
this.zip = zipCode;
}
}
然後,在newObject方法中,new一個新對象完全可以這樣做:
MyClass nestobject = new MyClass
{
Name = "yy",
Number = "1111",
oclassMember = new OClass
{
addr = "neijiang",
zip = "404045"
}
};
使用了這麼多,需要注意的也還是有:
自動屬性中,get和set後都有分號,花括號後邊沒有,二在對象初始化器的使用中,花括號中對各個屬性賦值時用逗號隔開,花括號結束了用分號。本質原因,自動屬性是屬性定義,按C# 2.0語法,get和set分別相當於一個語句,花括號相當於方法的開始和結束。而使用對象初始化器,相當於使用花括號來調用其構造函數,整個new的過程相當於一條語句。
在使用對象初始化器設置嵌套的屬性類型的時候,內層嵌套的屬性用對象初始化器後的花括號後也是用逗號,而不是用分號。如果這嵌套的屬性放在了最後,則不用,如上例。
不管是嵌套的屬性,或者不嵌套的屬性,或者被嵌套的屬性,使用對象初始化器,要去該對象所屬的類必須提供沒有參數的構造函數,否則會報錯:does not contain a constructor that takes '0' arguments。
使用對象初始化器時,花括號中對屬性賦值的順序可以交換,如:
MyClass nestobject1 = new MyClass
{
Name = "yy",
oclassMember = new OClass
{
addr = "neijiang",
zip = "404045"
},
Number = "1111"
};
也是對的。