C# 3.0 引入物件初始化器與集合初始化器,讓物件建立與賦值合而為一,大幅減少樣板程式碼。本文解析語法規則、編譯器降級後的 IL 邏輯,並示範巢狀初始化實務。
public class Student { public string FirstName; public string LastName; }
// 傳統
var s1 = new Student();
s1.FirstName = "Bruce";
s1.LastName = "Willis";
// C# 3.0
var s2 = new Student { FirstName = "Bruce", LastName = "Willis" };
適用於實作 ICollection<T> 的類型(List<T>、Dictionary<K,V> 等)。
// List
var names = new List { "Alice", "Bob", "Chris" };
// Dictionary
var dict = new Dictionary
{
[1] = "One",
[2] = "Two"
};
// 巢狀初始化:班級與學生
var classes = new List
{
new Class { Name = "Science", Students = new List { "Laura", "George" } },
new Class { Name = "Commerce", Students = new List { "Bill", "Hillary" } }
};
public class Class
{
public string Name;
public List Students = new List();
}
編譯器將初始化器轉換為建立物件 → 呼叫 Add 方法 → 指派屬性/欄位的序列。以巢狀範例為例,IL 邏輯等同於:
var classes = new List();
var c1 = new Class { Name = "Science" };
c1.Students.Add("Laura");
c1.Students.Add("George");
classes.Add(c1);
var c2 = new Class { Name = "Commerce" };
c2.Students.Add("Bill");
c2.Students.Add("Hillary");
classes.Add(c2);
// newobj List.ctor()
IL_0002: newobj instance void class [mscorlib]System.Collections.Generic.List`1::.ctor()
IL_0007: stloc.1
// newobj Class.ctor()
IL_000a: newobj instance void Class::.ctor()
IL_000f: stloc.2
// stfld Name
IL_0010: ldloc.2
IL_0011: ldstr "Science"
IL_0016: stfld string Class::Name
// callvirt List.Add("Laura")
IL_001b: ldloc.2
IL_001c: ldfld class List Class::Students
IL_0021: ldstr "Laura"
IL_0026: callvirt instance void List::Add(!0)
// ... 後續同理
ICollection<T>(具備 Add(T) 方法)。list = { x = 1 } ❌)。[key] = value(C# 6+),內部呼叫 Add(key, value)。集合與物件初始化器是 C# 3.0 最具生產力的語法糖之一,編譯器自動展開為標準呼叫,零效能損耗。善用巢狀初始化可大幅簡化複雜資料結構的建構程式碼,提升可讀性與維護性。