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

C# 3.0 物件與集合初始化器:宣告式初始化語法全解析

     編輯:關於C語言

為什麼需要初始化器?

傳統建構函式 + 屬性指派方式冗長且非原子性:

var p = new Point();
p.X = 0;
p.Y = 1;

物件/集合初始化器提供宣告式、單一運算式的初始化語法,編譯器展開為等效的建構+指派序列,確保原子性(中間狀態不可見)。

物件初始化器語法

var p = new Point { X = 0, Y = 1 }; // 隱含呼叫無參數建構函式

等同於:

var p = new Point();
p.X = 0;
p.Y = 1;

巢狀物件初始化

var rect = new Rectangle {
    P1 = new Point { X = 0, Y = 1 },
    P2 = new Point { X = 2, Y = 3 }
};

編譯器使用暫存變數確保原子性:

var __p1 = new Point(); __p1.X = 0; __p1.Y = 1;
var __p2 = new Point(); __p2.X = 2; __p2.Y = 3;
var rect = new Rectangle(); rect.P1 = __p1; rect.P2 = __p2;

針對現有實例成員初始化(非新建)

若建構函式已初始化巢狀物件,可省略 new:

public class Rectangle {
    Point p1 = new Point();
    Point p2 = new Point();
    public Point P1 { get { return p1; } }
    public Point P2 { get { return p2; } }
}

var r = new Rectangle {
    P1 = { X = 0, Y = 1 }, // 初始化既有 p1,非指派新物件
    P2 = { X = 2, Y = 3 }
};

等同於:r.P1.X = 0; r.P1.Y = 1; ...

集合初始化器語法

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

需求:

  • 型別實作 ICollection<T>
  • 元素型別隱含轉換至 T

編譯器展開為連續 Add 呼叫:

var list = new List<int>();
list.Add(0); list.Add(1); ... list.Add(9);

結合物件與集合初始化

var contacts = new List<Contact> {
    new Contact {
        Name = "Chris Smith",
        PhoneNumbers = { "206-555-0101", "425-882-8080" } // 集合初始化器
    },
    new Contact {
        Name = "Bob Harris",
        PhoneNumbers = { "650-555-0199" }
    }
};

進階:隱含型別陣列搭配匿名型別

var contacts = new[] {
    new { Name = "Chris", Phones = new[] { "206-555-0101" } },
    new { Name = "Bob", Phones = new[] { "650-555-0199" } }
};

編譯器推斷陣列元素型別為匿名型別,建立強型別資料結構零樣板程式碼。

限制與注意事項

  • 不可在初始化器中存取正在初始化的物件(this 不可用)
  • 同一屬性/欄位僅能出現一次
  • 實值型別屬性不可使用巢狀物件初始化器(需先指派實例)
  • 集合初始化器元素不可為指派運算式(避免與成員初始化器混淆)

初始化器讓 C# 具備資料導向的宣告式風格,特別適合測試資料建構、DTO 填充、組態物件建立等場景,是現代 C# 程式碼簡潔度的關鍵貢獻者。

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