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()メソッドは、次の条件を満たさなければなりません。
public override bool Equals( object obj ) { // クラスのメソッドが呼び出されている以上 thisはnullではない // よって比較対象がnullであるならば、等しくはない if( obj == null ) { return false; } // 型が異なるならば、等しくはない if( GetType() != obj.GetType() ) { return false; } // ==演算子のメソッドを使用して比較する return ( this == ( MyClass )obj ); }Object.Equals メソッド (System) | Microsoft Learn
Equals()メソッドをオーバーライドしたならば、GetHashCode()もオーバーライドします。このハッシュコードは、コレクション内での効率的な挿入と参照に用いられます。
public override int GetHashCode() { return this.a ^ this.b; }
等値である2つのオブジェクトは、等しいハッシュコードを返すようにします。一方でハッシュコードが等しくても、同一のオブジェクトである必要はありません。Remarks - Object.GetHashCode Method (System) | Microsoft Learn