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

C# 3.0 物件初始化器與集合初始化器詳細指南

     編輯:關於C#

物件初始化器

允許在建立物件時,以大括號語法直接指派屬性/欄位值,無需呼叫多載建構函式:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    internal int InternalField; // internal 亦可指派
    private int PrivateField;   // private 不可指派
}

// 使用
var p = new Person
{
    FirstName = "Scott",
    LastName = "Guthrie",
    InternalField = 56,
    // Age 未指派,預設 0
};

常見問題解答

問題答案
可只指派部分屬性?✅ 可,未指派者為預設值
可指派 internal 成員?✅ 可 (同組件內)
可指派 private 成員?❌ 不可
可搭配建構函式?✅ 可,建構函式先執行,初始化器後執行 (可覆蓋建構函式設定的值)

建構函式 vs 初始化器執行順序

var cookie = new Cookie("name", "value") { Name = "newName" };
// 1. 呼叫 Cookie(string, string) 建構函式,Name = "name"
// 2. 執行初始化器,Name = "newName" (覆蓋)
// 結果: cookie.Name == "newName"

集合初始化器

針對實作 IEnumerable 且有 Add 方法的集合,簡化元素新增:

// List<T>
var people = new List<Person>
{
    new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 },
    new Person { FirstName = "Bill", LastName = "Gates" },
    new Person { FirstName = "Susanne", Age = 32 },
    null, // 允許 null 元素
};

// Dictionary / Hashtable (雙層大括號)
var dict = new Dictionary<int, Person>
{
    { 1, new Person { FirstName = "Scott", Age = 32 } },
    { 2, new Person { FirstName = "Bill" } },
    { 3, null },
};

// 自訂集合類別需實作 IEnumerable 並提供 Add 方法
public class MyCollection : IEnumerable
{
    public void Add(Person p) { ... }
    public IEnumerator GetEnumerator() { ... }
}

編譯器轉換原理

物件初始化器編譯為:建立暫時變數 → 呼叫建構函式 → 逐一指派屬性 → 指派給目標變數。集合初始化器編譯為:建立集合實例 → 逐一呼叫 Add 方法。這純屬語法糖,IL 層面無特殊指令。

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