子類別物件可透過 as 轉為基類別,導致不同型別物件進行判等,違反等價關係(自反性、對稱性、傳遞性)。
Equals 參數為 object,值型別呼叫時必須裝箱,影響效率。建議值型別重載 == 與 !=:
public struct KeyData
{
private int _data;
public int Data { get { return _data; } set { _data = value; } }
public static bool operator ==(KeyData left, KeyData right)
=> left.Data == right.Data;
public static bool operator !=(KeyData left, KeyData right)
=> left.Data != right.Data;
}
.NET 要求 == 與 != 成對定義,確保判等一致性。
引用型別不應重載 == 運算符,應覆寫 Equals。這是 .NET 慣例:判斷引用型別相等用 Equals,不用 ==。
| 函數 | 操作結果 | 適用範圍 | 建議 |
|---|---|---|---|
| Object.ReferenceEquals | 兩參考是否同一物件 | 僅引用型別 | 勿用於值型別 |
| Object.Equals (靜態) | 委派給實例 Equals | 無限制 | 注意值型別裝箱影響 |
| 型別的 Equalls (實例) | 型別自定邏輯 | 無限制 | 值型別考慮裝箱成本 |
| 型別的 == 運算符 | 型別自定邏輯 | 無限制 | 引用型別勿重載 |