2012-01-25 8 views
45

私のオブジェクトにGetHashCode(またはオーバーライド)を実装する方法についてコミュニティから聞きたいと思います。私はequalsメソッドをオーバーライドする必要があることを理解しています。私はかなりの時間を実装しています。時には基本メソッドを呼び出すこともあります。私は、オブジェクトが同じ詳細(メンバ)を含んでいる場合、そのオブジェクトが別のインスタンスのオブジェクトと等しくなければならないことを理解します。どのようなクラスのメンバーからハッシュコードを取得する最善の方法は何ですか?GetHashCodeを正しく実装する

+2

http://stackoverflow.com/a/720282/93922 –

+2

を複製することを検討してください。これを行う前に、自分の記事を読んで理解することをおすすめします。http://blogs.msdn.com/b /ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –

+0

ありがとう、私はこれがよくある質問かもしれないと私は理解しています、私はもう少し狩りをしている必要があります。助けてくれてありがとう – Zivka

答えて

34

のは、あなたのクラスは次のようになりましょう:

class Frob { 
    public string Foo { get; set; } 
    public int Bar { get; set; } 
    public double FooBar { get; set; } 
} 

のは、あなたが彼らのFooとそのBarは等しいが、FooBar問題ではない場合Frobの2つのインスタンスが等しくなるように等しく定義するとしましょう。

次に、GetHashCodeFooBarで定義する必要があります。 1つの方法は、次のようなものです:

基本的には、等価を定義するすべてのフィールドを組み込みたいだけです。 1つの方法は、ちょうど私が行ったように、17で蓄積し、乗算を続けていくことです。それは速く、シンプルで正しいですし、通常は良い分布を与えます。

+5

これは質問そのものだと感じていますが、なぜ23ですか? –

+1

{2,1}と{1,2}を作る素因数が異なります。 –

+6

おそらく、GetHashCodeは2つのオブジェクト**が等しいとみなされるかもしれないということだけを伝えます。まだハッシュ衝突の可能性があります。 – geofftnz

関連する問題