web-dev-qa-db-ja.com

GetHashCodeを正しく実装する

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

56
Zivka

クラスが次のように見えるとしましょう:

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

FrobFooが等しい場合にBarの2つのインスタンスが等しいが、FooBarは関係ないように、equalsを定義するとします。

次に、GetHashCodeFooの観点からBarを定義する必要があります。 1つの方法は次のとおりです。

return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();

基本的に、平等を定義するすべてのフィールドを組み込むだけです。 1つの方法は、私がやったように、単に17を累積し乗算することです。それは高速で、シンプルで、正確で、通常は適切な分布を提供します。

46
jason