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

Effective C#:區別四個判等函數 (3) - 值型別與運算符重載最佳實踐

     編輯:關於C語言

子類別轉型破壞等價關係

子類別物件可透過 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

引用型別不應重載 == 運算符,應覆寫 Equals。這是 .NET 慣例:判斷引用型別相等用 Equals,不用 ==。

四種判等函數比較表

函數操作結果適用範圍建議
Object.ReferenceEquals兩參考是否同一物件僅引用型別勿用於值型別
Object.Equals (靜態)委派給實例 Equals無限制注意值型別裝箱影響
型別的 Equalls (實例)型別自定邏輯無限制值型別考慮裝箱成本
型別的 == 運算符型別自定邏輯無限制引用型別勿重載

撰寫判等函數三原則

  1. 確認型別是否具備判等意義
  2. 滿足等價規則(自反、對稱、傳遞)
  3. 值型別重載 ==/!=,引用型別覆寫 Equals
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved