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

C# 物件相等比較完全指南:ReferenceEquals、Equals 與 == 運算子差異解析

     編輯:關於C語言

引用型別的相等比較

C# 中引用型別有四種比較方式,各有其語意與適用場景:

1. ReferenceEquals 方法

靜態方法,判斷兩個參考是否指向同一個物件實例。null 與 null 視為相等。

Class1 x = new Class1();
Class1 y = new Class1();
bool b1 = ReferenceEquals(null, null); // true
bool b2 = ReferenceEquals(null, x);    // false
bool b3 = ReferenceEquals(x, y);       // false (不同實例)

2. 虛擬 Equals 方法

定義於 Object,可覆寫以實現值比較邏輯。預設行為同 ReferenceEquals。

3. 靜態 Equals 方法

Object.Equals(objA, objB) 兩參數版本,內部會處理 null 情況並呼叫虛擬 Equals,避免空參考例外。

4. == 運算子

介於嚴格值比較與參考比較之間。對於內建型別(如 string)會進行值比較;對於未覆寫運算子的自訂類別則退回參考比較。

值型別的相等比較

值型別理論上可用相同方法,但需經過裝箱。每次裝箱都會產生新的物件實例,導致 ReferenceEquals 永遠回傳 false,故無實際意義。應優先使用 Equals 或 == 進行值比較。

總結

  • ReferenceEquals:唯一純參考比較,不可覆寫。
  • 虛擬 Equals:主要擴展點,實作值語意相等。
  • 靜態 Equals:安全的雙參數包裝,建議庫作者使用。
  • == 運算子:語法糖,視型別定義而定,覆寫時應與 Equals 保持一致。

深入理解這四者差異,有助於正確實作 IEquatable<T>、覆寫 GetHashCode 以及設計不可變型別。

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