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

C# 3.0 匿名型別:編譯器自動產生的唯讀類別

     編輯:關於C語言

前言

C# 3.0 引入匿名型別,讓開發者無需預先定義類別,即可建立具名屬性的物件。廣泛用於 LINQ 投射、暫時資料封裝。本文解析語法、編譯器自動產生的 IL、限制與實務用法。

語法與範例


var person = new { Name = "Alice", Age = 30, City = "Taipei" };
Console.WriteLine($"{person.Name}, {person.Age}, {person.City}");

編譯器自動產生的類別

編譯器會產生一個內部密封類別(名稱如 <>f__AnonymousType0`3),特性:

  • 唯讀屬性:只有 get,無 set。
  • 建構函式:接收所有屬性值。
  • Equals/GetHashCode/ToString:依所有屬性值實作,支援值語意比較。
  • 泛型參數:屬性型別對應泛型參數。

// 等效產生代碼(簡化)
internal sealed class <>f__AnonymousType0
{
    private readonly TName _name;
    private readonly TAge _age;
    private readonly TCity _city;

    public <>f__AnonymousType0(TName name, TAge age, TCity city)
    { _name = name; _age = age; _city = city; }

    public TName Name => _name;
    public TAge Age => _age;
    public TCity City => _city;

    public override bool Equals(object obj) => ...; // 比較所有屬性
    public override int GetHashCode() => ...;
    public override string ToString() => $"{{ Name = {Name}, Age = {Age}, City = {City} }}";
}

關鍵特性

  1. 同結構同組件 = 同型別:同一組件中屬性名、順序、型別完全相同的匿名型別,共用同一個產生類別。
  2. 不可跨方法邊界:無法作為方法參數/回傳型別宣告(只能用 object 或 dynamic),通常搭配 var 在區域使用。
  3. 屬性名推導:new { x, y } → 屬性名自動為 x, y。
  4. 不可序列化:標記 [CompilerGenerated],大多序列化器不支援。

實務應用場景

  • LINQ 投射:select new { c.Name, OrderCount = c.Orders.Count }
  • 暫時資料傳遞:區域變數封裝多個相關值。
  • 動態建構 JSON 結構(搭配 System.Text.Json 匿名型別序列化支援)。

結語

匿名型別是編譯器語法糖,自動產生不可變、值語意的類別,極大簡化臨時資料結構定義。理解其唯讀、同結構共用型別、區域限制等特性,能正確應用於 LINQ 與區域邏輯中。

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