2つのオブジェクトが等値であることを検証するメソッドの、実装方法について解説します。
なお、すべてのクラスの基底クラスであるObjectクラスのEqualsメソッドは、オブジェクトが同一であるか (同一性) を判定するものであり、オブジェクトが持つフィールドの値は考慮していません。
一方で同一性を確認するには、つねにObjectクラスのReferenceEqualsメソッドを使用すべきです。これはクラスの実装によって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 );
}
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 );
}
Equalsメソッドをオーバーライドしたならば、GetHashCodeもオーバーライドします。
public override int GetHashCode()
{
return this.a ^ this.b;
}