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

C# 物件相等性比較全解析:參考型別 vs 實值型別

     編輯:關於C#

參考型別的四種比較方式

方法說明行為
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 或 ==(已正確多載)進行值比較。

最佳實務建議

  1. 覆寫 Equals 時:同時覆寫 GetHashCode、多載 ==/!=、實作 IEquatable<T>。
  2. 參考型別預設語意:ReferenceEquals、==(未多載)、Equals(未覆寫)皆為參考比較。
  3. 字串例外:string == string 為值比較,但 Object.Equals 仍建議使用。
  4. 實值型別:直接用 == 或 Equals,勿用 ReferenceEquals。

結語

理解「參考比較」與「值比較」的語意差異,正確選擇比較方法,是寫出健壯 C# 程式的基礎。

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