有時必須比較兩個值是否相等。 在某些情況下,您要測試 值相等,也稱為 等價,這表示兩個變數所包含的值相等。 在其他情況下,您必須判斷兩個變數是否參考記憶體中的相同基礎物件。 這種類型的相等稱為 參考相等或 身分識別。 本主題描述這兩種相等,並提供其他主題的連結以取得詳細資訊。
引用相等性
引用相等性表示兩個物件參考指向相同的基礎物件。 這可以透過簡單的指派進行,如下列範例所示。
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) = {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) = {areEqual}");
}
}
在此程式代碼中,會建立兩個物件,但在指派語句之後,兩個參考都會參考相同的物件。 因此,它們具有引用相等性。 使用 ReferenceEquals 方法來判斷兩個參考是否參考相同的物件。
參考相等的概念僅適用於參考型別。 實值型別物件不能有參考相等,因為當實值類型的實例指派給變數時,就會建立值的複本。 因此,您永遠不能有兩個指向記憶體中相同位置的非包裝結構體。 此外,如果您使用 ReferenceEquals 比較兩個實值型別,即使物件中包含的值都相同,結果一律會 false
。 這是因為每個變數都會被封裝成為單獨的物件實例。 如需詳細資訊,請參閱 如何測試參考相等性(身分識別)。
價值平等
值相等表示兩個物件包含相同的值或值。 對於基本實值類型,例如 int 或 bool,則值相等的測試很簡單。 您可以使用 == 運算符,如下列範例所示。
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
物件可能會定義為相等。 對於記錄,值相等表示如果類型相符,且所有屬性和域值相符,則記錄類型的兩個變數相等。
不過,不需要根據類型中的所有欄位來等價。 它可以以子集為基礎。 當您比較您不擁有的類型時,請務必特別瞭解該類型的等價的定義。 如需如何在您自己的類別和結構中定義值相等的詳細資訊,請參閱 如何定義類型的值相等。
浮點數值相等性
浮點數值的相等比較(雙精度 和 單精度)存在問題,因為二進位計算機上的浮點運算不夠精確。 如需詳細資訊,請參閱 主題中的備註 System.Double。
相關主題
標題 | 說明 |
---|---|
如何測試參考相等性 (身分識別) | 描述如何判斷兩個變數是否具有參考相等性。 |
如何定義類型 的值相等 | 描述如何為型別提供值相等的自定義定義。 |
類型 | 提供 C# 類型系統的相關信息,以及其他信息的連結。 |
記錄 | 提供記錄類型的相關信息,預設會測試值是否相等。 |