次の方法で共有


等価比較 (C# プログラミング ガイド)

等価性のために 2 つの値を比較することが必要な場合があります。 場合によっては、 値の等価性 ( 等価性とも呼ばれます) をテストしています。これは、2 つの変数に含まれる値が等しいことを意味します。 それ以外の場合は、2 つの変数がメモリ内の同じ基になるオブジェクトを参照しているかどうかを判断する必要があります。 この種類の等価性は、 参照等価性 ( ID) と呼ばれます。 このトピックでは、これら 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) = {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}");
    }
}

このコードでは、2 つのオブジェクトが作成されますが、代入ステートメントの後に、両方の参照が同じオブジェクトを参照します。 したがって、参照の等価性があります。 ReferenceEqualsメソッドを使用して、2 つの参照が同じオブジェクトを参照しているかどうかを判断します。

参照等価性の概念は、参照型にのみ適用されます。 値型オブジェクトは、値型のインスタンスが変数に割り当てられると、値のコピーが作成されるため、参照の等価性を持つことはできません。 そのため、メモリ内の同じ場所を参照する 2 つのボックス化されていない構造体を持つことはありません。 さらに、 ReferenceEquals を使用して 2 つの値の型を比較する場合、オブジェクトに含まれる値がすべて同じであっても、結果は常に falseされます。 これは、各変数が個別のオブジェクト インスタンスにボックス化されるためです。 詳細については、「 参照等価性 (IDENTITY) をテストする方法」を参照してください。

値の等価性

値の等価性は、2 つのオブジェクトに同じ値または値が含まれていることを意味します。 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 と等しい場合、2 つの Point オブジェクトが等価であると定義される場合があります。 レコードの場合、値の等値は、型が一致し、すべてのプロパティ値とフィールド値が一致する場合、レコード型の 2 つの変数が等しいことを意味します。

ただし、型内のすべてのフィールドに対して等価性を持つ必要はありません。 サブセットに基づくことができます。 所有していない型を比較するときは、その型に対して等価性がどのように定義されているかを明確に理解する必要があります。 独自のクラスと構造体で値の等価性を定義する方法の詳細については、「型の 値の等価性を定義する方法」を参照してください。

浮動小数点値の値の等価性

浮動小数点値 (doublefloat) の等価比較は、バイナリ コンピューターでの浮動小数点演算の不正確さのために問題があります。 詳細については、 System.Doubleトピックの解説を参照してください。

タイトル 説明
参照の等価性 (ID) をテストする方法 2 つの変数に参照等価性があるかどうかを判断する方法について説明します。
型の値の等価性を定義する方法 型の値の等価性のカスタム定義を提供する方法について説明します。
タイプ C# 型システムに関する情報と、追加情報へのリンクを提供します。
記録 既定で値の等価性をテストするレコードの種類に関する情報を提供します。