0

Equals() および Operator == をオーバーライドするためのガイドライン (C# プログラミング ガイド)に従って、equals(object) および equals(type) をオーバーライドするときに gethashcode をオーバーライドすることをお勧めします。

Equals をオーバーライドするための最適な実装については、無限の議論があることを理解しています。ただし、Equals の概念をもう少しよく理解し、自分で決定したいと思っています。

私の質問はおそらくちょっとばかげているでしょうが、ここに行きます:

  • Equals(object) と Equals(type) (指定されたパラメーターとは無関係) の主な違いは何ですか?

私が理解している限り(そして私は完全に間違っている可能性があるので、これは同時に質問です)

Equals(object) は、オブジェクト参照が同じかどうか (デフォルトで) を調べる組み込みメソッドです。Equals(Type) は、作成するローカル メソッドです。実際、そのクラスには、2 つのオーバーロードを持つ Equals メソッドがあります。

  • プロパティの等価性を 2 回チェックするのはなぜですか?

equals ( object)で:

   return base.Equals(obj) && z == p.z;

そしてequals(type)で:

   return base.Equals((TwoDPoint)p) && z == p.z;
  • Equals(type) メソッドを実装することが推奨されるのはなぜですか?

  • 私の質問のほとんどは、質問 1 の私の発言にラップされています。したがって、間違った、または誤解を招くような議論に注意してください plz. また、お気軽に情報を追加してください。確かに役立ちます。

前もって感謝します

4

2 に答える 2

2

まず、2つの方法を区別しましょう

object.Equals()objectとしてマークされているため、派生クラスでオーバーライドvirtualできるルート上のメソッドです。

IEquatable<T>.Equalsインターフェイスを実装することによって得られるメソッドです。IEquatable<T>

後者は、ジェネリックコレクション内の同等性を判断するために使用されます。したがって、ドキュメントを言います:

IEquatable <T>インターフェイスは、Contains、IndexOf、LastIndexOf、Removeなどのメソッドで同等性をテストするときに、Dictionary <TKey、TValue>、List <T>、LinkedList<T>などの汎用コレクションオブジェクトによって使用されます。ジェネリックコレクションに格納される可能性のあるすべてのオブジェクトに実装する必要があります。

前者は、他のすべての場所で平等を決定するために使用されます。

それで、基礎が整ったら、あなたの特定の質問のいくつかに答えてみましょう

Equals(オブジェクト)とEquals(タイプ)の主な違いは何ですか(指定されたパラメーターとは関係ありません)?

1つは任意のタイプで動作し、もう1つは同じタイプのインスタンスを比較します

なぜ彼らはプロパティの同等性を2回チェックするのですか?

それらはしません、一般的に1つだけが使用されます。ただし、多くの場合、一方の実装がもう一方の実装を内部的に呼び出します

Equals(type)メソッドを実装することが推奨されるのはなぜですか?

答えは上記です-オブジェクトをジェネリックコレクションに格納する場合

補足として、これを理解するのに役立つかもしれないものとして、同等性チェックのデフォルトの動作は、参照が同じであることをチェックすることです(つまり、あるオブジェクトが別のオブジェクトとまったく同じインスタンスである)。オブジェクトのフィールド内のいくつかのデータを比較するために、さまざまな等式ロジックをオーバーライド/実装することがよくあります(の例に似ていますz == p.z

于 2013-03-14T12:49:35.987 に答える
0

オーバーロードの違いの 1 つは、前述のように、一方はオブジェクトをコンパイル時に同じ型であることがわかっているものと比較するときに呼び出され、もう一方はそれ以外のすべての状況で呼び出されることです。言及されていないもう 1 つの非常に重要な違いは、 が のものだけでなく、 に暗黙的に変換可能なものにもEquals(ownType)作用することです。このため、オペランドを 型に強制しない限り、変換可能な型のオブジェクト間で等価関係を実装することは期待できません。たとえば、次のように考えてください。ownTypeownTypeEqualsObject

(12.0).Equals(12);

整数値 12 をDouble値 12.0 に変換します。渡された値の型と値が呼び出されて12.0いるメソッドと正確に一致するため、 が返されます。Equalstrue

(12).Equals(12.0);

Doubleは暗黙的に に変換できないため、代わりに値を asにInt32渡します。は呼び出されているメソッドの型と一致しないため、メソッドは を返します。DoubleObjectDouble12Equalsfalse

仮想メソッドEquals(Object)は等価関係を実装します。多くの場合、暗黙的な型変換を伴いますが、型固有のメソッドがそうすることは期待できません。

于 2013-09-28T22:22:42.960 に答える