當屬性本身為引用類型,可繼續使用對象初始化器:
// 嵌套類型定義
public class OClass
{
public string Addr { get; set; }
public string Zip { get; set; }
public OClass() { }
public OClass(string addr, string zip) { Addr = addr; Zip = zip; }
}
public class MyClass
{
public string Name { get; set; }
public string Number { get; set; }
public OClass OClassMember { get; set; }
}
// 使用嵌套初始化器
MyClass nestObj = new MyClass
{
Name = "yy",
Number = "1111",
OClassMember = new OClass
{
Addr = "neijiang",
Zip = "404045"
}
};
| 場景 | 分隔符 | 結束符 | 本質 |
|---|---|---|---|
| 自動屬性定義 | get/set後分號 | 花括號無分號 | 屬性聲明語法 |
| 對象初始化器 | 屬性賦值間逗號 | 花括號後分號 | 表達式語句 |
| 嵌套初始化器(非末尾) | 內層花括號後逗號 | 外層花括號後分號 | 表達式列表元素 |
| 嵌套初始化器(末尾) | 內層花括號無分隔 | 外層花括號後分號 | 表達式列表最後元素 |
public class NoDefaultCtor
{
public NoDefaultCtor(int x) { } // 僅有帶參構造函數
}
// 編譯錯誤:'NoDefaultCtor' 不包含接受 0 個參數的構造函數
var obj = new NoDefaultCtor { Prop = "value" };
原因:編譯器先生成new NoDefaultCtor(),再逐屬性賦值。
MyClass obj = new MyClass
{
Name = "yy",
OClassMember = new OClass { Addr = "neijiang", Zip = "404045" },
Number = "1111" // 最後賦值,完全合法
};
編譯器保證按聲明順序生成賦值代碼,但語義上順序無關。
public無參構造函數。