允許在建立物件時,以大括號語法直接指派屬性/欄位值,無需呼叫多載建構函式:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
internal int InternalField; // internal 亦可指派
private int PrivateField; // private 不可指派
}
// 使用
var p = new Person
{
FirstName = "Scott",
LastName = "Guthrie",
InternalField = 56,
// Age 未指派,預設 0
};
| 問題 | 答案 |
|---|---|
| 可只指派部分屬性? | ✅ 可,未指派者為預設值 |
| 可指派 internal 成員? | ✅ 可 (同組件內) |
| 可指派 private 成員? | ❌ 不可 |
| 可搭配建構函式? | ✅ 可,建構函式先執行,初始化器後執行 (可覆蓋建構函式設定的值) |
var cookie = new Cookie("name", "value") { Name = "newName" };
// 1. 呼叫 Cookie(string, string) 建構函式,Name = "name"
// 2. 執行初始化器,Name = "newName" (覆蓋)
// 結果: cookie.Name == "newName"
針對實作 IEnumerable 且有 Add 方法的集合,簡化元素新增:
// List<T>
var people = new List<Person>
{
new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 },
new Person { FirstName = "Bill", LastName = "Gates" },
new Person { FirstName = "Susanne", Age = 32 },
null, // 允許 null 元素
};
// Dictionary / Hashtable (雙層大括號)
var dict = new Dictionary<int, Person>
{
{ 1, new Person { FirstName = "Scott", Age = 32 } },
{ 2, new Person { FirstName = "Bill" } },
{ 3, null },
};
// 自訂集合類別需實作 IEnumerable 並提供 Add 方法
public class MyCollection : IEnumerable
{
public void Add(Person p) { ... }
public IEnumerator GetEnumerator() { ... }
}
物件初始化器編譯為:建立暫時變數 → 呼叫建構函式 → 逐一指派屬性 → 指派給目標變數。集合初始化器編譯為:建立集合實例 → 逐一呼叫 Add 方法。這純屬語法糖,IL 層面無特殊指令。