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

C# 3.0 集合初始化器深度剖析:從語法糖到 IL 代碼生成全過程

     編輯:關於C語言

C# 3.0 聲明式集合構建


var classes = new List
{
    new MyClass 
    { 
        NameOfClass = "Science", 
        StudentNames = { "Laura", "George" } 
    },
    new MyClass 
    { 
        NameOfClass = "Commerce", 
        StudentNames = { "Bill", "Hillary" } 
    }
};

編譯器等價展開代碼


var classes = new List();
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);

ILDASM 反編譯鐵證

Main 方法 IL 關鍵片段


IL_0002: newobj List::.ctor()
IL_0007: stloc.1                    // 臨時列表
IL_000a: newobj MyClass::.ctor()    // c1
IL_000f: stloc.2
IL_0010: ldloc.2
IL_0011: ldstr "Science"
IL_0016: stfld MyClass::NameOfClass
IL_001b: ldloc.2
IL_001c: ldfld MyClass::StudentNames
IL_0022: ldstr "Laura"
IL_0027: callvirt List::Add
... 後續同理:Add George, Add c1, 然後 c2 同樣流程

IL 明確展示:編譯器生成精確的構造、賦值、Add 調用序列,無任何魔法運行期機制。

集合初始化器設計規則回顧

  • 目標實現 ICollection<T>
  • 元素初始化器非賦值表達式(避免與對象初始化器混淆)
  • 編譯器按順序生成 Add 調用

總結

集合初始化器將「創建 + 循環 Add」壓縮為聲明式單表達式。編譯器負責展開,運行期零開銷。ILDASM 驗證確認生成代碼與手寫等價。此特性配合對象初始化器、var、匿名類型,構成 C# 3.0 聲明式數據構建的完整拼圖,為 LINQ 查詢結果投影提供語法支撐。

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