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

Effective C# 原則 9:釐清多種相等運算之關係(一)

     編輯:關於C語言

四種相等比較方法概覽

建立自訂型別(類別或結構)時,必須定義何種情況下視為相等。C# 提供四種不同方法判斷兩物件是否相等:

public static bool ReferenceEquals(object left, object right);
public static bool Equals(object left, object right);
public virtual bool Equals(object right);
public static bool operator ==(MyClass left, MyClass right);

雖然語言允許為四種方法建立自訂版本,但「能不代表該做」。你永遠不需重新定義前兩個方法。常見的是建立執行個體 Equals() 定義型別語意;偶爾為實值型別效能重載 == 運算子。幸運的是,四個方法關聯緊密,改變一個會影響其餘。你只需處理其中兩個即可。

實值型別與參考型別的相等語意差異

C# 允許同時建立實值與參考型別。兩參考型別變數參考同一物件時相等(如同物件 ID)。兩實值型別變數型別與內容皆相同時相等。這就是為何需要多種相等測試方法。

Object.ReferenceEquals():永遠不需重新定義

當兩變數參考同一物件(具相同物件 ID)時回傳 true。無論比較型別為何,總檢查物件 ID 而非內容。甚至比較同一實值型別物件也回傳 false(因發生兩次裝箱,原則 16 將討論)。

int i = 5, j = 5;
if (Object.ReferenceEquals(i, j)) Console.WriteLine("Never happens.");
else Console.WriteLine("Always happens.");
if (Object.ReferenceEquals(i, i)) Console.WriteLine("Never happens.");
else Console.WriteLine("Always happens.");

你永遠不需重新定義 ReferenceEquals(),它已確實實現功能:檢查兩變數物件 ID 是否相同。

靜態 Object.Equals():委派給左側參數

此方法在不知兩參數執行階段型別時,檢查是否相等。System.Object 是所有型別最終基類,任何比較的變數皆為 System.Object 執行個體。不知型別時如何比較?答案簡單:將比較責任委派給其中一個正在比較的型別。實作如下:

public static bool Equals(object left, object right)
{
    if (left == right) return true;
    if ((left == null) || (right == null)) return false;
    return left.Equals(right);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved