首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 物件與集合初始化器完整指南:語法、進階用法與字典初始化

     編輯:關於C語言

前言

C# 3.0 引入物件初始化器與集合初始化器,讓物件建立與集合填充更簡潔、宣告式。本文詳細解析語法規則、編譯器行為、巢狀初始化、字典初始化等進階主題,附豐富範例。

一、物件初始化器

基本語法

var student = new StudentName {
    FirstName = "Craig",
    LastName = "Playstead",
    ID = 116
};

編譯器處理流程

  1. 呼叫預設建構函式(無參數)建立實例。
  2. 依序指派指定的屬性/欄位。

重要:若類別無公用預設建構函式(如標記 private 或僅有帶參數建構函式),使用物件初始化器將編譯失敗。

完整範例:StudentName 類別

public class StudentName {
    // 必須有公用預設建構函式
    public StudentName() { }

    public StudentName(string first, string last) {
        FirstName = first;
        LastName = last;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int ID { get; set; }

    public override string ToString() => $"{FirstName} {ID}";
}

多種初始化方式對比

// 1. 傳統建構函式
var s1 = new StudentName("Craig", "Playstead"); // ID = 0

// 2. 物件初始化器(僅設定 FirstName, LastName)
var s2 = new StudentName { FirstName = "Craig", LastName = "Playstead" }; // ID = 0

// 3. 僅設定 ID
var s3 = new StudentName { ID = 183 }; // FirstName/LastName 為 null

// 4. 完整設定
var s4 = new StudentName { FirstName = "Craig", LastName = "Playstead", ID = 116 };

輸出結果

Craig 0
Craig 0
183
Craig 116

二、集合初始化器

集合初始化器本質是物件初始化器的序列,適用於實作 IEnumerable 並有 Add 方法的類型(如 List<T>、陣列等)。

List<StudentName> 初始化

var students = new List<StudentName> {
    new StudentName { FirstName = "Craig", LastName = "Playstead", ID = 116 },
    new StudentName { FirstName = "Shu", LastName = "Ito", ID = 112 },
    new StudentName { FirstName = "Gretchen", LastName = "Rivas", ID = 113 },
    new StudentName { FirstName = "Rajesh", LastName = "Rotti", ID = 114 }
};

編譯器展開為:

var students = new List<StudentName>();
students.Add(new StudentName { FirstName = "Craig", LastName = "Playstead", ID = 116 });
students.Add(new StudentName { FirstName = "Shu", LastName = "Ito", ID = 112 });
// ...

三、字典初始化器

Dictionary<TKey, TValue> 的 Add 方法接受兩個參數(Key, Value),初始化時需用雙層大括號:

  • 外層:字典元素的 Key-Value 配對
  • 內層:Value 物件的初始化器

Dictionary<int, StudentName> 範例

var students = new Dictionary<int, StudentName> {
    { 111, new StudentName { FirstName = "Sachin", LastName = "Karnik", ID = 211 } },
    { 112, new StudentName { FirstName = "Dina", LastName = "Salimzianova", ID = 317 } },
    { 113, new StudentName { FirstName = "Andy", LastName = "Ruth", ID = 198 } }
};

結構拆解

{
    { 111, new StudentName { ... } },  // 外層 {} 包裹 Key-Value,內層 {} 初始化 StudentName
    { 112, new StudentName { ... } },
    { 113, new StudentName { ... } }
}

四、進階技巧與注意事項

1. 巢狀物件初始化

var order = new Order {
    Customer = new Customer { Name = "Acme", Email = "acme@example.com" },
    Items = new List<OrderItem> {
        new OrderItem { Product = "Widget", Qty = 10 },
        new OrderItem { Product = "Gadget", Qty = 5 }
    }
};

2. 索引子初始化(C# 6.0+)

支援 Dictionary 或自訂索引子:

var dict = new Dictionary<string, int> {
    ["key1"] = 1,
    ["key2"] = 2
};

3. 僅讀屬性/自動實作唯讀屬性(C# 6.0+)

物件初始化器無法設定唯讀屬性(無 set),需透過建構函式。

4. 匿名型別與初始化器

var point = new { X = 10, Y = 20 }; // 編譯器產生唯讀屬性的匿名型別

5. 效能考量

  • 物件初始化器編譯後等同於建構後逐行指派,無額外效能成本。
  • 集合初始化器編譯為連續 Add 呼叫,大量資料時考慮預先 Capacity 或改用陣列/其他方式。

五、總結比較表

初始化器類型適用目標核心語法編譯器展開
物件初始化器 任何有公用預設建構函式的類別/結構 new T { Prop = val } new T() → 指派屬性
集合初始化器 實作 IEnumerable 且有 Add 方法的集合 new List { new T {..}, new T {..} } new List() → Add(item1) → Add(item2)...
字典初始化器 Dictionary<K,V> 等雙參數 Add new Dict { {k, new V{..}}, {k, new V{..}} } new Dict() → Add(k1, v1) → Add(k2, v2)...
索引子初始化器 有索引子的類型(C# 6+) new T { ["key"] = val } new T() → this["key"] = val

六、結語

物件與集合初始化器是現代 C# 寫出清晰、可維護代碼的利器。掌握其編譯器語意、巢狀用法與字典雙層大括號規則,能讓資料初始化代碼更具宣告式風格,減少樣板代碼,提升可讀性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved