1. 程式人生 > >C#中 Reference Equals, == , Equals的區別

C#中 Reference Equals, == , Equals的區別

Equals 的預設實現僅支援引用相等,但派生類可重寫此方法以支援值相等。

對於引用型別,相等定義為物件相等;即這些引用是否引用同一物件。對於值型別,相等定義為按位相等。ValueType 類支援值型別。

給實現者的說明 此方法可由派生類重寫。例如,如果兩個物件表示相同的值,則許多基資料型別返回 true;否則返回 false。 此方法僅比較基元和物件。若要比較更復雜的結構(如物件陣列),必須重寫該方法。 下面的語句對於 Equals 方法的所有實現均必須為真。在列表中,x、y 和 z 表示不為 空引用(在 Visual Basic 中為 Nothing) 的物件引用。

  • 除涉及浮點型的情況外,x.Equals(x) 都返回 true

    。請參見 IEC 60559:1989, Binary Floating-point Arithmetic for Microprocessor Systems。

  • 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 方法的其他必需行為,請參見 GetHashCodeEquals 的實現必須不引發異常。 對於某些型別的物件,最好讓 Equals 測試值相等性而非引用相等性。如果兩個物件具有相同的“值”,那麼即使它們不是同一例項,這樣的 Equals 實現仍返回 true。型別實施者決定物件的“值”的構成,但這通常是儲存在物件的例項變數中的部分或全部資料。例如,String 的值基於字串的字元;對於兩個按同樣的順序包含完全相同的字元的字串例項,String 類的 Equals 方法返回 true。 實現 IComparable 的型別必須重寫 Equals。 重寫 Equals
的型別也必須重寫 GetHashCode;否則,Hashtable 可能不正常工作。 如果程式語言支援運算子過載,並且您選擇了過載給定型別的相等運算子,則該型別必須重寫 Equals 方法。這樣的 Equals 方法實現必須返回與相等運算子相同的結果。遵照此準則有助於確保使用 Equals 的類庫程式碼(如 ArrayListHashtable)的行為方式與應用程式程式碼使用的相等運算子的方式一致。 下面是針對實現值型別的準則:
  • 考慮重寫 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 確定兩個物件是否是相同的例項。