在 C# 3.0 中,物件初始化器與集合初始化器是兩項極具實用價值的語法糖,它們大幅簡化了物件建立與初始化的程式碼,讓原本需要數行敘述的操作縮減為單一陳述式。這不僅提升了程式碼的可讀性,更為 LINQ 查詢表達式的簡潔撰寫奠定了基礎。
物件初始化器允許我們在使用 new 關鍵字建立物件時,直接在類型名稱後的大括號 {} 中指定屬性值。語法直觀易懂:
public class Staff
{
public string Name { get; set; }
public int Age { get; set; }
public string Address;
public Staff() { }
public Staff(int age, string name)
{
Name = name;
Age = age;
}
}
使用物件初始化器的多種形式:
// 呼叫預設建構函式並初始化屬性
Staff s1 = new Staff { Name = "IORI", Age = 27 };
// 呼叫自訂建構函式並覆寫/補充屬性
Staff s2 = new Staff(12, "sss") { Name = "GUOJUN" };
Staff s3 = new Staff(12, "sss") { Name = "GUOJUN", Age = 27, Address = "HuBei" };
關鍵行為:
new Staff { ... }),編譯器會隱式呼叫無參數的預設建構函式。new Staff(12, "sss") { ... }),則呼叫對應的自訂建構函式。這些語法特性純粹在編譯器層面實現。編譯器會將初始化器展開為建立暫存變數、呼叫建構函式、逐一指派屬性、最後指派給目標變數的序列。例如:
staff <>g__initLocal3 = new staff(12, "sss");
<>g__initLocal3.Name = "GUOJUN";
staff s1 = <>g__initLocal3;
這證明了物件初始化器不改變執行階段語義,僅提供編譯期便利。
集合初始化器擴展了相同概念至實作 ICollection<T> 的類型,允許在建立集合時直接列舉元素:
List<Staff> myList = new List<Staff>
{
new Staff { Name = "GUOJUN", Age = 27 },
new Staff { Name = "IORI", Age = 27 },
new Staff(12, "sss") { Name = "GUOJUN" }
};
編譯器同樣將其轉換為建立集合實例、逐一建立元素物件、呼叫 Add 方法加入集合的程式碼。這使得巢狀物件圖的建構變得極為簡潔,特別適合 LINQ 查詢結果的投影與物件圖的序列化場景。
物件與集合初始化器是 C# 3.0 引入的核心語法增強之一,它們消除了大量樣板式程式碼,讓物件圖的建構更接近宣告式風格。理解其編譯期轉換機制,有助於開發者正確預期執行行為(如建構函式呼叫順序、暫存變數生命週期),並在效能敏感場合做出明智選擇。