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

C# 3.0 集合初始化器與物件初始化器:語法、IL 原理與實務應用

     編輯:關於C語言

前言

C# 3.0 引入物件初始化器與集合初始化器,讓物件建立與賦值合而為一,大幅減少樣板程式碼。本文解析語法規則、編譯器降級後的 IL 邏輯,並示範巢狀初始化實務。

物件初始化器

public class Student { public string FirstName; public string LastName; }

// 傳統
var s1 = new Student();
s1.FirstName = "Bruce";
s1.LastName = "Willis";

// C# 3.0
var s2 = new Student { FirstName = "Bruce", LastName = "Willis" };

集合初始化器

適用於實作 ICollection<T> 的類型(List<T>、Dictionary<K,V> 等)。

// List
var names = new List { "Alice", "Bob", "Chris" };

// Dictionary
var dict = new Dictionary
{
    [1] = "One",
    [2] = "Two"
};

// 巢狀初始化:班級與學生
var classes = new List
{
    new Class { Name = "Science", Students = new List { "Laura", "George" } },
    new Class { Name = "Commerce", Students = new List { "Bill", "Hillary" } }
};

public class Class
{
    public string Name;
    public List Students = new List();
}

編譯器降級原理

編譯器將初始化器轉換為建立物件 → 呼叫 Add 方法 → 指派屬性/欄位的序列。以巢狀範例為例,IL 邏輯等同於:

var classes = new List();
var c1 = new Class { Name = "Science" };
c1.Students.Add("Laura");
c1.Students.Add("George");
classes.Add(c1);
var c2 = new Class { Name = "Commerce" };
c2.Students.Add("Bill");
c2.Students.Add("Hillary");
classes.Add(c2);

IL 片段對照

// newobj List.ctor()
IL_0002: newobj instance void class [mscorlib]System.Collections.Generic.List`1::.ctor()
IL_0007: stloc.1

// newobj Class.ctor()
IL_000a: newobj instance void Class::.ctor()
IL_000f: stloc.2

// stfld Name
IL_0010: ldloc.2
IL_0011: ldstr "Science"
IL_0016: stfld string Class::Name

// callvirt List.Add("Laura")
IL_001b: ldloc.2
IL_001c: ldfld class List Class::Students
IL_0021: ldstr "Laura"
IL_0026: callvirt instance void List::Add(!0)
// ... 後續同理

限制與注意事項

  • 集合類型必須實作 ICollection<T>(具備 Add(T) 方法)。
  • 初始化器中不可使用賦值運算式(如 list = { x = 1 } ❌)。
  • 僅限建立新物件時使用;現有物件無法用初始化器語法添加元素。
  • Dictionary 使用索引子初始化 [key] = value(C# 6+),內部呼叫 Add(key, value)。

實務應用場景

  1. 測試資料建構:單元測試快速建立複雜物件圖。
  2. 設定檔對應:JSON/XML 反序列化後直接對應強型別集合。
  3. 流暢介面建構:搭配 Builder Pattern 簡化物件建立。

結語

集合與物件初始化器是 C# 3.0 最具生產力的語法糖之一,編譯器自動展開為標準呼叫,零效能損耗。善用巢狀初始化可大幅簡化複雜資料結構的建構程式碼,提升可讀性與維護性。

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