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

C# 銳利體驗 (四) (4):Object 類別方法實戰範例

     編輯:關於C語言

實例方法 GetHashCode()

為相應型別提供雜湊碼值,用於雜湊演算法或雜湊表。若重寫 Equals(object obj),必須同時重寫 GetHashCode()——兩個物件值相等,其雜湊碼應相等。

完整示範程式碼

using System;

struct A { public int count; }
class B { public int number; }
class C
{
    public int integer = 0;
    public override bool Equals(object obj)
    {
        C c = obj as C;
        if (c != null) return this.integer == c.integer;
        return false;
    }
    public override int GetHashCode() { return 2 ^ integer; }
}

class Test
{
    public static void Main()
    {
        A a1, a2; a1.count = 10; a2 = a1;
        Console.Write(a1.Equals(a2));           // True (值型別預設比較值)
        Console.WriteLine(object.ReferenceEquals(a1, a2)); // False (值型別無參考相等)

        B b1 = new B(); B b2 = new B(); b1.number = 10; b2.number = 10;
        Console.Write(b1 == b2);                // False (參考型別預設比較參考)
        Console.Write(b1.Equals(b2));           // False (未重寫 Equals)
        Console.WriteLine(object.ReferenceEquals(b1, b2)); // False
        b2 = b1;
        Console.Write(b1 == b2);                // True
        Console.Write(b1.Equals(b2));           // True
        Console.WriteLine(object.ReferenceEquals(b1, b2)); // True

        C c1 = new C(); C c2 = new C(); c1.integer = 10; c2.integer = 10;
        Console.Write(c1 == c2);                // False
        Console.Write(c1.Equals(c2));           // True (重寫 Equals 比較值)
        Console.WriteLine(object.ReferenceEquals(c1, c2)); // False
        c2 = c1;
        Console.Write(c1 == c2);                // True
        Console.Write(c1.Equals(c2));           // True
        Console.WriteLine(object.ReferenceEquals(c1, c2)); // True
    }
}

執行輸出

TrueFalse
FalseFalseFalse
TrueTrueTrue
FalseTrueFalse
TrueTrueTrue

其他 Object 方法

  • GetType():與 typeof 語義相同,查詢物件中繼資料確定執行時型別。詳細見第十講。
  • ToString():回傳物件字串表達。未重寫時通常回傳型別名稱。
  • Finalize():受保護方法,C# 有特殊語義,見第五講。
  • MemberwiseClone():受保護方法,回傳物件「影子複製」。僅按位複製:值型別欄位賦值複製,參考型別欄位複製參考(指向同一記憶體)。不可被子類別重寫。相對應為「深度複製」,參考型別進行值複製,透過實作 ICloneable 介面(提供 Clone() 方法)完成。

掌握 Object 類別為類別學習鋪好基礎,但這只是銳利之旅一小步。成員初始化、記憶體參考釋放、繼承多型、異常處理等「銳利」特技堪稱浩瀚,讓我們繼續期待後續專題!

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