Equals 和 GetHashCode

Equals 的每個實現都必須滿足以下要求:

  • 反身 :一個物體必須與自己相等。
    x.Equals(x) 返回 true

  • 對稱 :如果我將 x 與 y 或 y 與 x 進行比較沒有區別 - 結果是相同的。
    x.Equals(y) 返回與 y.Equals(x) 相同的值。

  • 傳遞 :如果一個物件等於另一個物件而該物件等於第三個物件,則第一個物件必須等於第三個物件。
    如果 (x.Equals(y) && y.Equals(z)) 返回 true,則 x.Equals(z) 返回 true

  • 一致 :如果多次將物件與另一個物件進行比較,結果始終相同。
    只要未修改 x 和 y 引用的物件,x.Equals(y) 的連續呼叫將返回相同的值。

  • 與 null 的比較 :沒有物件等於 null
    x.Equals(null) 返回 false

GetHashCode 的實現:

  • Equals 相容 :如果兩個物件相等(意味著 Equals 返回 true),則 GetHashCode 必須為每個物件返回相同的值。

  • 大範圍 :如果兩個物件不相等(Equals 表示錯誤),則它們的雜湊碼很可能是不同的。由於可供選擇的數量有限,因此通常無法進行完美雜湊。

  • 便宜 :在所有情況下計算雜湊碼應該很便宜。

請參閱: 過載等於()和運算子==的指南