實作型別判等函數必須滿足這三條規則。
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 後直接比較,必須先嚴格檢查型別完全相同。
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 結果。