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

C# 型別相等與恆等深度解析:Equality vs Identity

     編輯:關於C語言

核心定義

概念定義關鍵點
Equality (相等)兩個物件型別相同,且所有欄位值相等需滿足自反性、對稱性、傳遞性
Identity (恆等/同一性)兩個參考指向同一記憶體位址參考型別專屬;值型別永遠不具 Identity

CLR 提供的四種比較機制


// 1. 靜態 ReferenceEquals:永遠比較 Identity
object.ReferenceEquals(a, b);

// 2. 靜態 Equals:比較 Equality(內部呼叫虛擬 Equals)
object.Equals(a, b);

// 3. 實例虛擬 Equals:預設比較 Identity,值型別重寫比較值
a.Equals(b);

// 4. 運算子 ==:可多載,行為由型別定義
a == b;

值型別 vs 參考型別行為差異

值型別 (struct)

  • ReferenceEquals 永遠回傳 false(會裝箱產生不同物件)。
  • ValueType.Equals 使用反射逐欄位比較,效能差 → 建議自行重寫 Equals 並多載 ==/!=。

參考型別 (class)

  • 預設 Equals/== 比較參考(Identity)。
  • 若語意為「值語意」(如 string、Uri),必須重寫 Equals 並多載 ==/!=。

Equals vs == 多型行為差異


object a = "hello";
object b = "hello";

Console.WriteLine(a.Equals(b)); // true:虛擬方法多型,呼叫 string.Equals
Console.WriteLine(a == b);      // false:編譯期綁定 object.== (參考比較)

Equals 是虛擬方法(多型),== 是靜態多載(編譯期決定)。

最佳實務清單

  1. 實作值型別:重寫 Equals(object)、IEquatable<T>.Equals(T)、多載 ==/!=、實作 GetHashCode。
  2. 實作參考型別(值語意):同樣重寫上述成員,並考慮 IEquatable<T>。
  3. 參考型別(參考語意):不要 重寫 Equals/==,保留預設 Identity 行為。
  4. 永遠搭配 GetHashCode 實作,確保字典/雜湊集合正確運作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved