web-dev-qa-db-ja.com

IEquatableを理解する

_IEquatable<T>_インターフェイス を使用して比較するオブジェクトを実装すると、次のようになります。

  1. Equals(object)をすでに実装しているのに、なぜEquals(T)メソッドをオーバーライドする必要があるのですか?
  2. _==_を実装したら、_!=_および_IEquatable<T>_演算子を使用できますか?
52
leora
  1. _IEquatable<T>_に関するMSドキュメントの記事

    _IEquatable<T>_を実装する場合は、Equals(Object)およびGetHashCode()の基本クラス実装もオーバーライドして、それらの動作がEquals(T)の動作と一致するようにする必要があります。方法。 Equals(Object)をオーバーライドする場合、オーバーライドされた実装は、クラスの静的Equals(Object, Object)メソッドの呼び出しでも呼び出されます。さらに、_op_Equality_および_op_Inequality_演算子をオーバーロードする必要があります。これにより、等しいかどうかのすべてのテストで一貫した結果が返されます。

  2. いいえ、 演算子はEqualsメソッドを使用しません 。そのためには、 個別にオーバーロードする必要があります

52
Ray Booysen

1)Rayが言ったように、_IEquatable<T>_の実装を(静的に)知らないクラスからメソッドが呼び出されたときに一貫性を確保するためにEquals(object)をオーバーライドします。たとえば、非ジェネリックコレクションクラスは比較にEquals(object)を使用します。 GetHashCode()もオーバーライドする必要があります。

2)_IEquatable<T>_を実装しても、==および!=演算子が自動的にオーバーロードされることはありませんが、_System.String_のように、そうすることを妨げるものは何もありません。ただし、これを明確に文書化する必要があります-同一性比較を引き続き使用する他のタイプの参照(MyTypeやObjectなど)を比較するときは注意してください。コードで非常に頻繁に使用される型でない限り、これを行うのは良い考えではないと思います。そこでは誰もがそれに非常に慣れるでしょうandここで、オーバーロードの構文上の砂糖==は実際に読みやすさにプラスの影響を与える。

43
Jon Skeet