為相應型別提供雜湊碼值,用於雜湊演算法或雜湊表。若重寫 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
typeof 語義相同,查詢物件中繼資料確定執行時型別。詳細見第十講。ICloneable 介面(提供 Clone() 方法)完成。掌握 Object 類別為類別學習鋪好基礎,但這只是銳利之旅一小步。成員初始化、記憶體參考釋放、繼承多型、異常處理等「銳利」特技堪稱浩瀚,讓我們繼續期待後續專題!