C#中 Reference Equals, == , Equals的區別
Equals 的預設實現僅支援引用相等,但派生類可重寫此方法以支援值相等。
對於引用型別,相等定義為物件相等;即這些引用是否引用同一物件。對於值型別,相等定義為按位相等。ValueType 類支援值型別。
給實現者的說明 此方法可由派生類重寫。例如,如果兩個物件表示相同的值,則許多基資料型別返回 true;否則返回 false。 此方法僅比較基元和物件。若要比較更復雜的結構(如物件陣列),必須重寫該方法。 下面的語句對於 Equals 方法的所有實現均必須為真。在列表中,x、y 和 z 表示不為 空引用(在 Visual Basic 中為 Nothing) 的物件引用。
-
除涉及浮點型的情況外,x.Equals(x) 都返回 true
-
x.Equals(y) 返回與 y.Equals(x) 相同的值。
-
如果 x 和 y 都為 NaN,則 x.Equals(y) 返回 true。
-
當且僅當 x.Equals(z) 返回 true 時,(x.Equals(y) && y.Equals(z)) 才返回 true。
-
只要不修改 x 和 y 引用的物件,對 x.Equals(y) 的相繼呼叫將返回相同的值。
-
x.Equals(空引用(在 Visual Basic 中為 Nothing)) 返回 false
-
考慮重寫 Equals,以便在 ValueType 上獲得比 Equals 的預設實現所提供的效能增強的效能。
-
如果重寫 Equals 並且語言支援運算子過載,則必須過載值型別的相等運算子。
-
如果引用型別的語義是基於該型別表示某個(些)值的事實,則考慮對該型別重寫 Equals。
-
即使大多數引用型別重寫 Equals,它們也必須不能過載相等運算子。但是,如果實現的引用型別想要具有值語義(如複雜的數字型別),則必須重寫相等運算子。
-
using System;
public class Sample {
void Method() {
Object Obj1 = new Object();
Object Obj2 = new Object();
Console.WriteLine(Obj1.Equals(Obj2)); //===> false
Obj2 = Obj1;
Console.WriteLine(Obj1.Equals(Obj2)); //===> true
}
}===================================================
Object.Equals 方法 (Object, Object)
確定指定的 Object 例項是否被視為相等。
引數
- objA
- objB
-
要比較的第二個 Object。
返回值
如果 objA 是與 objB 相同的例項,或者如果兩者均為空引用,或者如果 objA.Equals(objB) 返回 true,則為 true;否則為 false。
備註Equals 的預設實現僅支援引用相等,但派生類可重寫此方法以支援值相等。
對於引用型別,相等定義為物件相等;即這些引用是否引用同一物件。對於值型別,相等定義為按位相等。ValueType 類支援值型別。
在呼叫 objA.Equals(objB) 前,此方法首先檢查兩個引數是否均為空引用。
示例下面的程式碼示例比較不同的物件。
複製程式碼C# -
Object.ReferenceEquals 方法
確定指定的 Object 例項是否是相同的例項。
引數
- objA
- objB
要比較的第二個 Object。
返回值
-
如果 objA 是與 objB 相同的例項,或者如果二者都為空引用,則為 true;否則為 false。
示例
下面的程式碼示例使用 ReferenceEquals 確定兩個物件是否是相同的例項。