0

myclass というクラスがあるとします。

私のコードには、myclass の 2 つのインスタンス、myclass1 と myclass2 があります。それらについてのすべては、(パブリックおよびプライベート)プロパティが同一であることです。

それらの両方を HashSet に追加しようとすると、両方または 1 つだけが追加されますか? 両方を追加したくない場合は、myclass 定義で equals を上書きできますか? HasSet はそれを使用する方法を知っていますか?

4

1 に答える 1

2

簡単な答えは、オブジェクトの Equals メソッドに依存します。

より長い答え:

HashSet は IEqualityComparer を使用して、2 つのオブジェクトが等しいかどうかを判断します。提供しない場合はEqualityComparer.Default、 ;が使用されます。object.Equals(a, b) といくつかのものを効果的に使用して、値の型のボックス化を回避します。

ドキュメントの確認object.Equals(a, b): null を確認した後に効果的に実行a.Equals(b)されます。

のデフォルトの実装でobject.Equals(other)は、参照の等価性のみをチェックします (つまり、それらはオブジェクトのまったく同じインスタンスです) が、これをオーバーライドして、ID フィールドが同一かどうかのチェックなど、任意のチェックを実行できます。Equals をオーバーライドするときは、GetHashCode もオーバーライドする必要があることに注意してください。

オブジェクトの定義を変更せずに HashSet が等価性を判断する方法を変更したい場合は、代わりにカスタム IEqualityComparer を提供できます。

于 2009-08-21T22:13:35.833 に答える