オブジェクトの等値を確認するメソッドの実装方法

2つのオブジェクトが等値であることを検証するメソッドの、実装方法について解説します。

なおオブジェクトの同一性を確認するには、Object.ReferenceEquals()を使用すべきです。これはクラスの実装によってEqualsが、等値性か同一性のいずれを評価するかが明白ではないためです。

クラスの定義

クラスは、

class MyClass
{
    private int a;
    private int b;
}

のようなフィールドを持つものとします。

等値演算子

public static bool operator ==( MyClass m1, MyClass m2 )
{
    // すべてのフィールドの値が等しいならば、そのオブジェクトは等しい
    return ( m1.a == m2.a && m1.b == m2.b );
}

非等値演算子

public static bool operator !=( MyClass m1, MyClass m2 )
{
    // ==演算子の否定を返す
    return !( m1 == m2 );
}

Equals()メソッド

Equals()メソッドは、次の条件を満たさなければなりません。

  • 反射律
  • 対称律
  • 推移律
  • 一貫性
public override bool Equals( object obj )
{
    // クラスのメソッドが呼び出されている以上 thisはnullではない
    // よって比較対象がnullであるならば、等しくはない
    if( obj == null )
    {
        return false;
    }

    // 型が異なるならば、等しくはない
    if( this.GetType() != obj.GetType() )
    {
        return false;
    }

    // ==演算子のメソッドを使用して比較する
    return ( this == ( MyClass )obj );
}
Object.Equals メソッド (System) | Microsoft Learn

GetHashCode()メソッド

Equals()メソッドをオーバーライドしたならば、GetHashCode()もオーバーライドします。このハッシュコードは、コレクション内での効率的な挿入と参照に用いられます。

public override int GetHashCode()
{
    return this.a ^ this.b;
}

等値である2つのオブジェクトは、等しいハッシュコードを返すようにします。一方でハッシュコードが等しくても、同一のオブジェクトである必要はありません。Remarks - Object.GetHashCode Method (System) | Microsoft Learn

Microsoft Learnから検索