Equals
メソッドを実装するときに、次のドキュメントでさまざまなアプローチについて説明しているのはなぜですか?
2番目のドキュメント(より新しい)Equals
は、 (のような)の強く型付けされたバージョンを明示的に実装していませんpublic bool Equals(MySuperTrooperClass o)
。
ガイドラインの1つから強く型付けされた方法を削除する根本的な理由は何ですか?また、本番コードでどのアプローチを使用する必要がありますか?
Equals
メソッドを実装するときに、次のドキュメントでさまざまなアプローチについて説明しているのはなぜですか?
2番目のドキュメント(より新しい)Equals
は、 (のような)の強く型付けされたバージョンを明示的に実装していませんpublic bool Equals(MySuperTrooperClass o)
。
ガイドラインの1つから強く型付けされた方法を削除する根本的な理由は何ですか?また、本番コードでどのアプローチを使用する必要がありますか?
厳密に型指定されたバージョンを削除してもメリットはありません。最初のページ自体が言及しているように、まったく逆です
Equals (オブジェクト) の実装に加えて、パフォーマンスを向上させるために、すべてのクラスで独自の型の Equals (型) も実装することをお勧めします。
これは、値型の場合に二重に当てはまります。
で定義されているのは弱く型付けされたバージョンのみであるため、2 ページ目はこれにまったく関係していないと思いますSystem.Object
。通常、強く型付けされたバージョンは、 と の間の相互作用について言及しているドキュメントの実装と密接に関連していIEquatable<T>
ます。Equals(T)
Equals(object)
Equals
多くのプリミティブ型をオーバーロードするという Microsoft の決定の残念な副作用は、 が((Object)X).Equals(Y)
等価関係として動作する場合でも (そうあるべきです)、暗黙的な変換のためにそうでX.Equals(Y)
はない場合が多いことです。たとえば、3.Equals(3.0)
false を返しますが、(3.0).Equals(3)
true を返します。==
演算子はそれほど悪くはありませんが (一般に if , X==Y
) Y==X
、同値関係を指定していません (たとえば、if X = Int64.MaxValue、Y=X-1、および Z=(Double)X の場合、X== Z および Y==Z ですが、X!=Y)。
おそらく、 Microsoft がEquals()
which の動作が と同じであるオーバーロードを提供することについてのアドバイスを取り下げた理由Equals(Object)
は、暗黙のキャストによって前者が等価関係として動作できなくなる可能性がある一方で、後者は例外なく等価関係として動作する必要があるためです。
2つのものが同じ値を持っているかどうかを確認する場合は、==を使用します
。2つのものが実際に同じインスタンスを参照しているかどうかを確認する場合は、Equals()を使用します。
Equals()がtrueの場合にのみ、==もtrueでなければならないことに注意してください。
GetHashCode()について-ディクショナリなどの構造を含む場合は、この特定のメソッドを使用してデータを区別します。データをどのように区別するかはあなた次第ですが、オブジェクトの値が正しく機能するように変更されている間は、GetHashCode()を変更しないでください。つまり、オブジェクトの存続期間中、同じ値を保持する必要があります。
あなたがそのような何かをするとき:
MyClass A = new MyClass();
MyClass B = A;
(A == B)かどうかを確認するときは、実際にポインタAのアドレスがポインタBのアドレスと同じ値であるかどうかを確認します。
したがって、一般的な開発の99.99%でEquals()を実装する必要はありません。
パフォーマンスを向上させるには、厳密に型指定された Equals を実装する必要があります。最初の記事に書いてある通り