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

Effective C#:區別四個判等函數 (2) - Equals 實作細節與等價關係

     編輯:關於C語言

等價關係三要素

  • 自反性:a == a
  • 對稱性:a == b ⇒ b == a
  • 傳遞性:a == b 且 b == c ⇒ a == c

實作型別判等函數必須滿足這三條規則。

型別的 Equals 實作模式

public override bool Equals(object right)
{
    // 1. 檢查 null
    if (right == null) return false;
    
    // 2. 參考相等快速判斷
    if (object.ReferenceEquals(this, right)) return true;
    
    // 3. 型別檢查 - 關鍵步驟
    if (this.GetType() != right.GetType()) return false;
    
    // 4. 安全轉型並比較成員
    KeyData rightAsKeyData = right as KeyData;
    return this.Data == rightAsKeyData.Data;
}

關鍵點:型別檢查

if (this.GetType() != right.GetType()) 確保只有相同型別才比較,避免子類別破壞等價關係。這也是為什麼不建議在 Equals 中使用 is 或 as 後直接比較,必須先嚴格檢查型別完全相同。

靜態 Object.Equals 運作機制

public static bool Equals(object left, object right)
{
    if (left == right) return true;        // 參考相等或同為 null
    if (left == null || right == null) return false; // 單一 null
    return left.Equals(right);             // 委派給實例方法
}

靜態 Equals 依賴型別的 == 運算符(前兩步)與實例 Equals(最後一步),因此型別是否正確實作這兩者直接影響靜態 Equals 結果。

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