相等比較 (C# 程式設計指南)

有時候需要比較兩個值是否相等。 在某些情況下,您要測試「值是否相等」 (也稱為「等價」,表示兩個變數所含的值相等。 在其他情況下,您必須判斷兩個變數是否參照記憶體中的相同基礎物件。 這類型的相等稱為「參考相等」或「識別」。 本主題描述這兩種相等,並提供其他主題的連結以取得詳細資訊。

參考相等

參考相等表示兩個物件參考都指向相同的基礎物件。 這可能是透過簡單指派所發生,如下列範例所示。

using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    public static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);
    }
}

在這個程式碼中,建立兩個物件,但在指派陳述式之後,這兩個參考都指向相同的物件。 因此,它們具有參考相等。 使用 ReferenceEquals 方法,以判斷兩個參考是否指向相同的物件。

參考相等的概念只適用於參考類型。 因為將實值型別的執行個體指派給變數時會建立實值的複本,所以實值型別物件不能具有參考相等。 因此,您絕不會有兩個參照記憶體中相同位置的 Unboxed 結構。 此外,如果您使用 ReferenceEquals 來比較兩個實值型別,則結果一律為 false,即使物件中所包含的值完全相同也是一樣。 這是因為每個變數都會對個別物件執行個體進行 Boxed 處理。 如需詳細資訊,請參閱如何測試參考相等性(身分識別)。

實值相等

實值相等表示兩個物件包含相同的值。 對於 intbool 這類基本實值型別,測試實值相等十分簡單。 您可以使用 == 運算子,如下列範例所示。

int a = GetOriginalValue();  
int b = GetCurrentValue();  
  
// Test for value equality.
if (b == a)
{  
    // The two integers are equal.  
}  

對於大部分其他類型,測試實值相等較為複雜,因為您需要了解類型如何定義它。 對於具有多個欄位或屬性的類別和結構,通常會定義實值相等,表示所有欄位或屬性具有相同的值。 例如,如果 pointA.X 等於 pointB.X 而且 pointA.Y 等於 pointB.Y,則兩個 Point 物件可能定義為相等。 針對 record,值相等表示若類型相符且所有屬性與欄位值相符,則 record 類型的兩個變數相等。

不過,相等性不需要根據類型中的所有欄位。 而是根據子集。 當您比較不屬於您的類型時,務必特別了解如何定義該類型的相等性。 如需如何在您自己的類別和結構中定義值相等的詳細資訊,請參閱 如何定義型別的值相等性。

浮點值的實值相等

浮點值的相等比較 (doublefloat) 有問題,因為二進位電腦上的浮點算術不精確。 如需詳細資訊,請參閱 System.Double 主題中的備註。

標題 描述
如何測試參考相等性 (身分識別) 描述如何判斷兩個變數是否具有參考相等。
如何定義型別的值相等 描述如何提供類型實值相等的自訂定義。
類型 提供 C# 類型系統的相關資訊以及其他資訊的連結。
記錄 提供記錄類型的相關信息,預設會測試值是否相等。