| 方法 | 說明 | 行為 |
|---|---|---|
Object.ReferenceEquals(a, b) | 靜態方法 | 比較兩參考是否指向同一物件;null == null 回傳 true |
a.Equals(b)(虛擬) | 可覆寫 | 預設比較參考;覆寫後可比較內容值 |
Object.Equals(a, b)(靜態) | 雙參數 | 內部呼叫 a.Equals(b),但可處理 a == null 情況 |
a == b(運算子) | 可多載 | 介於嚴格參考比較與嚴格值比較之間;string 多載為值比較 |
Class1 x = new Class1(), y = new Class1();
ReferenceEquals(null, null); // true
ReferenceEquals(null, x); // false
ReferenceEquals(x, y); // false (不同實例)
x.Equals(y); // false (預設參考比較)
Object.Equals(x, y); // false
x == y; // false (未多載運算子時為參考比較)
ReferenceEquals 永遠回傳 false,無意義。Equals 或 ==(已正確多載)進行值比較。GetHashCode、多載 ==/!=、實作 IEquatable<T>。ReferenceEquals、==(未多載)、Equals(未覆寫)皆為參考比較。string == string 為值比較,但 Object.Equals 仍建議使用。== 或 Equals,勿用 ReferenceEquals。理解「參考比較」與「值比較」的語意差異,正確選擇比較方法,是寫出健壯 C# 程式的基礎。