| 概念 | 定義 | 關鍵點 |
|---|---|---|
| Equality (相等) | 兩個物件型別相同,且所有欄位值相等 | 需滿足自反性、對稱性、傳遞性 |
| Identity (恆等/同一性) | 兩個參考指向同一記憶體位址 | 參考型別專屬;值型別永遠不具 Identity |
// 1. 靜態 ReferenceEquals:永遠比較 Identity
object.ReferenceEquals(a, b);
// 2. 靜態 Equals:比較 Equality(內部呼叫虛擬 Equals)
object.Equals(a, b);
// 3. 實例虛擬 Equals:預設比較 Identity,值型別重寫比較值
a.Equals(b);
// 4. 運算子 ==:可多載,行為由型別定義
a == b;
ReferenceEquals 永遠回傳 false(會裝箱產生不同物件)。ValueType.Equals 使用反射逐欄位比較,效能差 → 建議自行重寫 Equals 並多載 ==/!=。Equals/== 比較參考(Identity)。string、Uri),必須重寫 Equals 並多載 ==/!=。
object a = "hello";
object b = "hello";
Console.WriteLine(a.Equals(b)); // true:虛擬方法多型,呼叫 string.Equals
Console.WriteLine(a == b); // false:編譯期綁定 object.== (參考比較)
Equals 是虛擬方法(多型),== 是靜態多載(編譯期決定)。
Equals(object)、IEquatable<T>.Equals(T)、多載 ==/!=、實作 GetHashCode。IEquatable<T>。GetHashCode 實作,確保字典/雜湊集合正確運作。