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

C# 3.0 系列:匿名類型在 CLR 中的實現 (1) — 編譯器視角

     編輯:關於C語言

語言特性,非框架特性

匿名類型是 C# 3.0 語言/編譯器 的新特性,對 .NET Framework 3.5 / CLR 而言,它與一般具名類型無本質差別。CLR 看不出來這是「匿名」產生的。

簡單範例與 IL 觀察


var p1 = new { Name = "IORI", Age = 27 };

對應的 IL(簡化):


.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 3
    .locals init ([0] class '<>f__AnonymousType0`2'<string,int32> p1)
    IL_0000: nop
    IL_0001: ldstr "IORI"
    IL_0006: ldc.i4.s 27
    IL_0008: newobj instance void class '<>f__AnonymousType0`2'<string,int32>::.ctor(!0, !1)
    IL_000d: stloc.0
    IL_000e: ret
}

編譯器產生型別名稱:<>f__AnonymousType0`2<string,int32>,泛型參數對應屬性型別。

產生的型別結構(反編譯視圖)


internal sealed class <>f__AnonymousType0<<Name>j__TPar, <Age>j__TPar>
{
    // Fields
    private readonly <Age>j__TPar <Age>i__Field;
    private readonly <Name>j__TPar <Name>i__Field;

    // Methods
    public <>f__AnonymousType0(<Name>j__TPar Name, <Age>j__TPar Age);

    public override bool Equals(object value);
    public override int GetHashCode();
    public override string ToString();

    // Properties
    public <Age>j__TPar Age { get; }
    public <Name>j__TPar Name { get; }
}

關鍵特徵

  • 密封類別(sealed),不可繼承。
  • 欄位 readonly,屬性唯讀(僅 get)。
  • 自動覆寫 Equals、GetHashCode、ToString,實作值語意比較與顯示。
  • 建構函式接收所有屬性值,不可自訂。
  • 繼承自 System.Object。

這一切皆由編譯器在編譯期自動生成,執行期與手寫類別無異。

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