C# 中引用型別有四種比較方式,各有其語意與適用場景:
靜態方法,判斷兩個參考是否指向同一個物件實例。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 (不同實例)
定義於 Object,可覆寫以實現值比較邏輯。預設行為同 ReferenceEquals。
Object.Equals(objA, objB) 兩參數版本,內部會處理 null 情況並呼叫虛擬 Equals,避免空參考例外。
介於嚴格值比較與參考比較之間。對於內建型別(如 string)會進行值比較;對於未覆寫運算子的自訂類別則退回參考比較。
值型別理論上可用相同方法,但需經過裝箱。每次裝箱都會產生新的物件實例,導致 ReferenceEquals 永遠回傳 false,故無實際意義。應優先使用 Equals 或 == 進行值比較。
Equals 保持一致。深入理解這四者差異,有助於正確實作 IEquatable<T>、覆寫 GetHashCode 以及設計不可變型別。