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

C# 3.0 系列:物件初始化器與集合初始化器 (2)

     編輯:關於C語言

承上篇,我們繼續深入剖析集合初始化器的運作細節。核心概念很簡單:

編譯器會呼叫對應類別的建構函式建立一個暫存物件,然後設定屬性,最後加入集合。

集合初始化器語法範例

List<Staff> myListOfStaff = new List<Staff>
{
    new Staff { Name = "GUOJUN", Age = 27 },
    new Staff { Name = "IORI", Age = 27 },
    new Staff(12, "sss") { Name = "GUOJUN" }
};
foreach (Staff pt in myListOfStaff)
{
    Console.WriteLine(pt);
}

編譯器展開後的等效程式碼

透過反編譯觀察,集合初始化器的實現本質與物件初始化器如出一轍:

List<Staff> <>g__initLocal6 = new List<Staff>();
Staff <>g__initLocal7 = new Staff();
<>g__initLocal7.Name = "GUOJUN";
<>g__initLocal7.Age = 0x1b; // 27
<>g__initLocal6.Add(<>g__initLocal7);

Staff <>g__initLocal8 = new Staff();
<>g__initLocal8.Name = "IORI";
<>g__initLocal8.Age = 0x1b;
<>g__initLocal6.Add(<>g__initLocal8);

Staff <>g__initLocal9 = new Staff(12, "sss");
<>g__initLocal9.Name = "GUOJUN";
<>g__initLocal6.Add(<>g__initLocal9);

List<Staff> myListOfStaff = <>g__initLocal6;
foreach (Staff pt in myListOfStaff)
{
    Console.WriteLine(pt);
}

重點總結

  • 集合初始化器會自動產生暫存變數(<>g__initLocalX)來持有中間物件。
  • 每個元素先用建構函式建立,再逐一設定屬性,最後呼叫 Add 方法加入集合。
  • 支援混用無參數建構函式與帶參數建構函式(如第三個元素)。
  • 這一切純粹是編譯器語法糖,執行期無額外開銷,IL 碼與手寫展開版本完全一致。

理解這層機制,有助於在除錯或效能分析時看懂生成的中間碼。

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