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

C# 3.0 集合初始化器:建構與初始化集合物件的新語法

     編輯:關於C#

C# 3.0 引入集合初始化器,讓實作 ICollection<T> 的型別能像陣列一樣以宣告式語法初始化。本文詳細說明語法規則、編譯器轉換、巢狀集合與 IL 層面驗證。

語法規則

集合初始化器由大括號包裹的元素初始化器序列組成,以逗號分隔:


List<string> names = new List<string> { "Alice", "Bob", "Chris" };

限制條件:

  • 目標型別必須實作 System.Collections.Generic.ICollection<T>(單一 T)。
  • 每個元素初始化器必須隱式可轉換為 T。
  • 元素初始化器不可為指派運算式(即不可寫 X = 1),必須為物件建立運算式或值。
  • 編譯器依序產生 Add 方法呼叫。

巢狀集合與物件初始化器結合

可同時使用物件初始化器建構元素,並初始化元素內部的集合屬性:


public class MyClass
{
    public string NameOfClass;
    public List<string> StudentNames = new List<string>();
}

var classes = new List<MyClass>
{
    new MyClass
    {
        NameOfClass = "Science",
        StudentNames = { "Laura", "George" }  // 集合屬性初始化
    },
    new MyClass
    {
        NameOfClass = "Commerce",
        StudentNames = { "Bill", "Hillary" }
    }
};

編譯器轉換等價程式碼

上述初始化器編譯器轉換為:


var classes = new List<MyClass>();
var __c1 = new MyClass();
__c1.NameOfClass = "Science";
__c1.StudentNames.Add("Laura");
__c1.StudentNames.Add("George");
classes.Add(__c1);

var __c2 = new MyClass();
__c2.NameOfClass = "Commerce";
__c2.StudentNames.Add("Bill");
__c2.StudentNames.Add("Hillary");
classes.Add(__c2);

IL 層面驗證

使用 ILDASM 檢視編譯後的 Main 方法,可見:

  • 區域變數儲存暫存集合與元素物件
  • 依序 newobj 建構元素、stfld 設定屬性、callvirt 呼叫 List<T>.Add
  • 最終 stloc.0 指派給目標變數

這證明集合初始化器純粹為編譯期語法糖,不引入執行期額外開銷。

適用場景與最佳實踐

  • ✅ 靜態已知資料:單元測試資料、預設設定、種子資料
  • ✅ LINQ 查詢結果投影:select new List<T> { ... }
  • ✅ 物件圖建構:DTO、ViewModel 初始化
  • ⚠️ 大量動態資料:優先考慮 AddRange、List<T>(capacity) 或資料流處理
  • ⚠️ 複雜邏輯初始化:改用傳統迴圈或工廠方法,保持可讀性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved