傳統建構函式 + 屬性指派方式冗長且非原子性:
var p = new Point();
p.X = 0;
p.Y = 1;
物件/集合初始化器提供宣告式、單一運算式的初始化語法,編譯器展開為等效的建構+指派序列,確保原子性(中間狀態不可見)。
var p = new Point { X = 0, Y = 1 }; // 隱含呼叫無參數建構函式
等同於:
var p = new Point();
p.X = 0;
p.Y = 1;
var rect = new Rectangle {
P1 = new Point { X = 0, Y = 1 },
P2 = new Point { X = 2, Y = 3 }
};
編譯器使用暫存變數確保原子性:
var __p1 = new Point(); __p1.X = 0; __p1.Y = 1;
var __p2 = new Point(); __p2.X = 2; __p2.Y = 3;
var rect = new Rectangle(); rect.P1 = __p1; rect.P2 = __p2;
若建構函式已初始化巢狀物件,可省略 new:
public class Rectangle {
Point p1 = new Point();
Point p2 = new Point();
public Point P1 { get { return p1; } }
public Point P2 { get { return p2; } }
}
var r = new Rectangle {
P1 = { X = 0, Y = 1 }, // 初始化既有 p1,非指派新物件
P2 = { X = 2, Y = 3 }
};
等同於:r.P1.X = 0; r.P1.Y = 1; ...
List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
需求:
ICollection<T>T編譯器展開為連續 Add 呼叫:
var list = new List<int>();
list.Add(0); list.Add(1); ... list.Add(9);
var contacts = new List<Contact> {
new Contact {
Name = "Chris Smith",
PhoneNumbers = { "206-555-0101", "425-882-8080" } // 集合初始化器
},
new Contact {
Name = "Bob Harris",
PhoneNumbers = { "650-555-0199" }
}
};
var contacts = new[] {
new { Name = "Chris", Phones = new[] { "206-555-0101" } },
new { Name = "Bob", Phones = new[] { "650-555-0199" } }
};
編譯器推斷陣列元素型別為匿名型別,建立強型別資料結構零樣板程式碼。
this 不可用)初始化器讓 C# 具備資料導向的宣告式風格,特別適合測試資料建構、DTO 填充、組態物件建立等場景,是現代 C# 程式碼簡潔度的關鍵貢獻者。