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

C# 3.0 系列:匿名類型在 CLR 中的實現 (2) — 等值比較與類型共享

     編輯:關於C語言

實測匿名類型的行為特徵

透過下列程式碼觀察 GetHashCode、Equals、==、ToString 及型別身分:


class Program
{
    static void Main(string[] args)
    {
        var p1 = new { Name = "IORI", Age = 27 };
        var p2 = new { Name = "IORI", Age = 27 };
        var p3 = new { Name = "GUOJUN", Age = 27 };
        var p4 = new Person { Name = "GUOJUN", Age = 27 };

        Console.WriteLine("Base class of {0} is {1}", p1.GetType().Name, p1.GetType().BaseType);
        Console.WriteLine("p1.ToString() = {0}", p1.ToString());
        Console.WriteLine("p1.GetType() = {0}", p1.GetType());
        Console.WriteLine("p3.GetType() = {0}", p3.GetType());
        Console.WriteLine("p4.GetType() = {0}", p4.GetType());

        Console.WriteLine("p1.GetHashCode() = {0}", p1.GetHashCode());
        Console.WriteLine("(p1.GetHashCode() == p2.GetHashCode()) = {0}", p1.GetHashCode() == p2.GetHashCode());
        Console.WriteLine("(p1.GetHashCode() == p3.GetHashCode()) = {0}", p1.GetHashCode() == p3.GetHashCode());

        Console.WriteLine("p1.Equals(p2) = {0}", p1.Equals(p2));
        Console.WriteLine("p1.Equals(p3) = {0}", p1.Equals(p3));
        Console.WriteLine("p3.Equals(p4) = {0}", p3.Equals(p4));

        Console.WriteLine("(p1 == p2) = {0}", p1 == p2);
        Console.WriteLine("object.ReferenceEquals(p1.GetType(), p2.GetType()) = {0}", object.ReferenceEquals(p1.GetType(), p2.GetType()));
        Console.WriteLine("object.ReferenceEquals(p1.GetType(), p3.GetType()) = {0}", object.ReferenceEquals(p1.GetType(), p3.GetType()));
        Console.WriteLine("object.ReferenceEquals(p3.GetType(), p4.GetType()) = {0}", object.ReferenceEquals(p3.GetType(), p4.GetType()));

        Console.Read();
    }
}

class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
}

輸出結果分析

  • GetHashCode():依所有屬性值計算,屬性名稱、型別、順序、值皆相同則雜湊碼相等(p1 == p2)。
  • ToString():產生 { Name = IORI, Age = 27 } 格式字串。
  • Equals():值比較,p1.Equals(p2) 為 true。
  • == 運算子:參考比較,匿名類型未多載 ==/!=,故 p1 == p2 為 false(不同實例)。
  • 型別身分:p1、p2 共享同一個編譯器產生的型別(ReferenceEquals 為 true);p3 屬性名稱順序不同,屬不同型別;p4 為具名類別 Person,當然不同。

匿名類型核心特性總結

  • 繼承自 System.Object。
  • 所有屬性 唯讀(僅有 get)。
  • 不支援事件、自訂方法、運算子多載、自訂覆寫。
  • 為 密封類別(sealed)。
  • 僅能透過編譯器產生的建構函式建立(不可自訂)。

最關鍵的型別共享機制

編譯器不會為每個 { Prop = val, ... } 結構產生不同型別,而是依屬性名稱、型別、宣告順序決定型別身分(不含屬性值)。相同屬性簽章的匿名物件共享同一型別,皆為該型別的實例。

限制:此共享僅限於同一組件內。跨組件編譯會產生不同型別。

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