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

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

なお、すべてのクラスの基底クラスであるObjectクラスのEqualsメソッドは、オブジェクトが同一であるか (同一性) を判定するものであり、オブジェクトが持つフィールドの値は考慮していません。

一方で同一性を確認するには、つねにObjectクラスのReferenceEqualsメソッドを使用すべきです。これはクラスの実装によってEqualsが、等値性か同一性のいずれを評価するかが明白ではないためです。

Equalsメソッドが満たすべき条件

  • 反射律
  • 対称律
  • 推移律
  • 一貫性

コード

クラスは次のようなフィールドを持つものとします。

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

==演算子

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

!=演算子

public static bool operator !=( Foo foo1, Foo foo2 )
{
    // ==演算子の否定を返す
    return !( foo1 == foo2 );
}

Equalsメソッド

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

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

    // ==演算子のメソッドを使用して比較する
    return ( this == ( Foo )obj );
}

GetHashCodeメソッド

Equalsメソッドをオーバーライドしたならば、GetHashCodeもオーバーライドします。

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