等価比較 (C# プログラミング ガイド)
2 つの値が等しいかどうかを比較することが必要な場合があります。 そのような場合、値が等価であること (等価性と呼ばれる) をテストすることになります。等価性とは 2 つの変数に含まれる値が等しいことを意味します。 また、2 つの変数がメモリ内の同一の基になるオブジェクトを参照しているかどうかを確認する必要がある場合もあります。 このタイプの等価は、参照の等価性または同一性と呼ばれます。 ここでは、2 種類の等価について説明します。また、詳細について他のトピックへのリンクを示します。
参照の等価性
参照の等価とは、2 つのオブジェクト参照が同一の基になるオブジェクトを参照していることを意味します。 次の例に示すように、これは簡単な代入によって生じます。
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);
}
}
このコードでは、2 つのオブジェクトが作成されますが、代入ステートメント以降は、両方の参照が同一のオブジェクトを参照しています。 したがって、参照の等価性があります。 2 つの参照が同じオブジェクトを参照しているかどうかを判断するには、ReferenceEquals メソッドを使用します。
参照の等価性の概念は参照型のみに適用されます。 値型オブジェクトには参照の等価性がありません。これは、値型のインスタンスが変数に代入される場合、値のコピーが作成されるためです。 そのため、ボックス化を解除した 2 つの構造体でメモリ内の同じ場所を参照することはできません。 さらに、ReferenceEquals を使用して 2 つの値型を比較する場合、オブジェクトに含まれている値がすべて同一である場合でも、結果は常に false
になります。 これは、各変数が個別のオブジェクト インスタンスにボックス化されているためです。 詳細については、「参照の等価性 (同値) をテストする方法」を参照してください。
値の等価性
値が等価であるとは、2 つのオブジェクトが同じ値を含むことを意味します。 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 と等しい場合、2 つの Point
オブジェクトは等価であると定義されます。 レコードにおける値の等価性とは、型が一致し、かつプロパティおよびフィールドの値がすべて一致する場合にレコード型の 2 つの変数が等しいことを意味します。
ただし、等価性を 1 つの型のすべてのフィールドに基づいて判断する必要はありません。 サブセットに基づいて判断できます。 所有していない型を比較する場合は、その型の等価性がどのように定義されるのかを明確に理解している必要があります。 独自のクラスおよび構造体で値が等しいかどうかを定義する方法の詳細については、「型の値の等価性を定義する方法」を参照してください。
浮動小数点値での値の等価性
バイナリのコンピューター上での浮動小数点演算には誤差があるため、浮動小数点値 (double および float) の等価比較には問題があります。 詳細については、System.Double のトピックの「解説」を参照してください。
関連トピック
Title | 説明 |
---|---|
参照の等価性 (同値) をテストする方法 | 2 つの変数に参照の等価性があるかどうかを確認する方法を説明します。 |
型の値の等価性を定義する方法 | 型の値の等価性にカスタムの定義を指定する方法を説明します。 |
types | C# 型システムについて説明し、詳細情報へのリンクを示します。 |
レコード | 既定で値の等価性をテストするレコード型に関する情報を提供します。 |
.NET