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

C# 3.0 深度解析:物件初始化器與集合初始化器

     編輯:關於C#

在 C# 3.0 中,物件初始化器與集合初始化器是兩項極具實用價值的語法糖,它們大幅簡化了物件建立與初始化的程式碼,讓原本需要數行敘述的操作縮減為單一陳述式。這不僅提升了程式碼的可讀性,更為 LINQ 查詢表達式的簡潔撰寫奠定了基礎。

物件初始化器

物件初始化器允許我們在使用 new 關鍵字建立物件時,直接在類型名稱後的大括號 {} 中指定屬性值。語法直觀易懂:

public class Staff
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Address;
    
    public Staff() { }
    public Staff(int age, string name)
    {
        Name = name;
        Age = age;
    }
}

使用物件初始化器的多種形式:

// 呼叫預設建構函式並初始化屬性
Staff s1 = new Staff { Name = "IORI", Age = 27 };

// 呼叫自訂建構函式並覆寫/補充屬性
Staff s2 = new Staff(12, "sss") { Name = "GUOJUN" };
Staff s3 = new Staff(12, "sss") { Name = "GUOJUN", Age = 27, Address = "HuBei" };

關鍵行為:

  • 若未指定建構函式引數(如 new Staff { ... }),編譯器會隱式呼叫無參數的預設建構函式。
  • 若提供建構函式引數(如 new Staff(12, "sss") { ... }),則呼叫對應的自訂建構函式。
  • 可一次指派多個屬性,不需涵蓋所有屬性。

編譯器背後的運作機制

這些語法特性純粹在編譯器層面實現。編譯器會將初始化器展開為建立暫存變數、呼叫建構函式、逐一指派屬性、最後指派給目標變數的序列。例如:

staff <>g__initLocal3 = new staff(12, "sss");
<>g__initLocal3.Name = "GUOJUN";
staff s1 = <>g__initLocal3;

這證明了物件初始化器不改變執行階段語義,僅提供編譯期便利。

集合初始化器

集合初始化器擴展了相同概念至實作 ICollection<T> 的類型,允許在建立集合時直接列舉元素:

List<Staff> myList = new List<Staff>
{
    new Staff { Name = "GUOJUN", Age = 27 },
    new Staff { Name = "IORI", Age = 27 },
    new Staff(12, "sss") { Name = "GUOJUN" }
};

編譯器同樣將其轉換為建立集合實例、逐一建立元素物件、呼叫 Add 方法加入集合的程式碼。這使得巢狀物件圖的建構變得極為簡潔,特別適合 LINQ 查詢結果的投影與物件圖的序列化場景。

總結

物件與集合初始化器是 C# 3.0 引入的核心語法增強之一,它們消除了大量樣板式程式碼,讓物件圖的建構更接近宣告式風格。理解其編譯期轉換機制,有助於開發者正確預期執行行為(如建構函式呼叫順序、暫存變數生命週期),並在效能敏感場合做出明智選擇。

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