可能性の重複:C#ので
Why is it important to override GetHashCode when Equals method is overridden?()に等しいをオーバーライドするとき()?
1は、GetHashCodeメソッドを(上書きに失敗した場合のEqualsをオーバーライドするとき、どのような具体的に)()間違って行くことができますか?
可能性の重複:C#ので
Why is it important to override GetHashCode when Equals method is overridden?()に等しいをオーバーライドするとき()?
1は、GetHashCodeメソッドを(上書きに失敗した場合のEqualsをオーバーライドするとき、どのような具体的に)()間違って行くことができますか?
最も目に見える形でマッピング構造のためです。
辞書またはハッシュテーブルのキーとして使用する場合、これを行い、任意のクラスは、予期しない動作を持つことになります。理由ビーイングは、実装が両方のGetHashCodeメソッドを使用し、適切にテーブル内の値を見つけるために等しいことです。アルゴリズムの短いバージョンは、次の
GetHashCodeメソッドを維持するために失敗し、完全にこのアルゴリズムを破るだろう同期(およびその他多数)に等しいです。
ジャレッドパーソンズブログは平等とGetHashCodeメソッドは非常に重要である理由を実装するの良い説明があります。
あなた自身のブログへのリンクをupvoteすることは恥知らずですか? – JaredPar
あなたがGetHashCode
をオーバーライドしない場合は、あなたのオブジェクトを比較して何が、それは間違っているかもしれません。
それは2つのインスタンスが等しい場合GetHashCode
が同じ値を返さなければならないことが実証されているように、それは同じであってもよいグループオブジェクトへの最初のパスとしてGetHashCode
使用する平等のためにそれらをテストすることを望む任意のコードの特権であります(異なるハッシュコードを持つオブジェクトは等しいとは限りません)。あなたのGetHashCode
方法は同じオブジェクトに異なる値を返す場合、彼らは最初のパスで異なるグループに入ることがあり、そのEquals
方法を使用して比較されることはありません。
これは、任意のコレクション型データ構造に影響を与える可能性があるが、このような辞書、ハッシュセットとしてハッシュコードベースのものに特に問題となるであろう。
要約:Equals
をオーバーライドするときは、常にGetHashCode
を上書きし、その実装が一貫していることを確認してください。
それはハッシュキーの意図した動作に依存していると仮定すると、キーが動作するように失敗します使用するすべてのアルゴリズム。 Equal
ある
2つのオブジェクトがリモートでデフォルトの実装によって保証されていない、同じハッシュキーの値を、持っている必要があります。番バケットのコレクションとしてハッシュ/辞書構造の
と思います。あなたは常に自分GetHashCodeメソッド()に対応するバケツにものを入れる場合は、あなただけの何かがあるかどうかを確認する(equalsを使って())1つのバケットを検索する必要があります。あなたが正しいバケツを見ているなら、これは機能します。
だから、ルールは次のとおりです。等号())は、2つのオブジェクトが等しい(あると言うならば、彼らはは)(同じGetHashCodeメソッドを持っている必要があります。
番号付きのバケットを考えるのではなく、比較を避けるためにハッシュコードを使用する方が簡単だと思います。オブジェクトXのハッシュコードがどのような手段であっても、オブジェクトYのハッシュコードと一致しないことが分かっている場合、それらの何かを比較する必要はありません。バケットは、ハッシュコードが特定の値と等しくないアイテムをコードが無視する簡単な方法を提供しますが、多くのコレクションは同じバケットにソートされたアイテムであってもハッシュコードを明示的に比較します。 – supercat
ご清聴ありがとうございます。 –
実装は、使用するバケットの数をどのように決定しますか?これは固定値ですか? –