相等比較 (C# 程式設計手冊)
有時候需要比較兩個值是否相等。 在某些情況下,您會測試「實值相等」(Value Equality),也稱為「等價」(Equivalence),這表示兩個變數包含的值相等。 在其他情況下,您需判斷兩個變數是否參考記憶體中的同一個基礎物件。 這種相等稱為「參考相等」(Reference Equality) 或「一致」(Identity)。 本主題說明這兩種相等,並提供詳細資訊的其他主題連結。
參考相等
參考相等意指兩個物件參考全都參考到同一個基礎物件。 這只要用簡單的指派就可以做到,如下列範例所示。
using System;
class Test
{
public int Num { get; set; }
public string Str { get; set; }
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);
// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
此程式碼會建立兩個物件,但在指派陳述式後,兩個參考都參考到同一物件。 因此這兩個物件具有參考相等。 使用 Object.ReferenceEquals 方法即可判斷兩個參考是否參考到相同的物件。
參考相等的概念僅適用於參考型別。 實值型別物件不能有參考相等,因為當實值型別的執行個體指派給變數時,會產生一個實值副本。 因此,不可能有兩個 Unboxed 結構參考到記憶體中的相同位置。 此外,如果使用 ReferenceEquals 比較兩個實值型別,結果永遠會是 false,即使物件中包含的值全都一致也一樣。 這是因為每個變數都 Boxed 成不同的物件執行個體。 如需詳細資訊,請參閱 HOW TO:參考相等 (識別) 的測試 (C# 程式設計手冊)。
實值相等
實值相等是指兩個物件包含相同的值。 對於基本實值型別 (例如 int 或 bool),測試實值相等相當直接簡單。 您可以用 == 運算子,如下列範例所示。
int a = GetOriginalValue();
int b = GetCurrentValue();
// Test for value equality.
if( b == a)
{
// The two integers are equal.
}
至於大部分其他型別,測試實值相等比較複雜,因為您需要了解型別如何進行定義。 至於具有多重欄位或屬性的類別和結構,實值相等的定義通常是指所有欄位或屬性都有相同的值。 例如,有兩個 Point 物件,如果 pointA.X 等於 pointB.X 且 pointA.Y 等於 pointB.Y,即可定義為相等。
不過,沒有必要以型別中的所有欄位來定義等價。 可以以一個子集為準, 當您比較不屬於您的型別時,應確實了解該型別的等價是如何定義的。 如需如何在您自己的類別和結構中定義實值相等的詳細資訊,請參閱 HOW TO:定義型別的實值相等 (C# 程式設計手冊)。
浮點值的實值相等
浮點值的相等比較 (double 和 float) 會有問題,因為二進位電腦上的浮點數運算並不精確。 如需詳細資訊,請參閱 System.Double 主題中的備註。
相關主題
標題 |
描述 |
---|---|
說明如何判斷兩個變數是否具有參考相等。 |
|
說明如何提供型別的實值相等自訂定義。 |
|
提供重要 C# 語言功能以及能夠透過 .NET Framework 用於 C# 之功能的詳細資訊連結。 |
|
提供 C# 型別系統的詳細資訊以及其他資訊的連結。 |