コミュニティから、オブジェクトにGetHashCodeを実装する(またはオーバーライドする)方法についてお聞きしたいと思います。 equalsメソッドをオーバーライドする場合、そうする必要があることを理解しています。私はそれをかなりの回数実装しましたが、時にはベースメソッドを呼び出すだけです。オブジェクトに同じ詳細(メンバー)が含まれている場合、オブジェクトはオブジェクトの別のインスタンスに等しくなければならないことを理解しています。クラスのメンバーからハッシュコードを取得する最良の方法は何ですか?
クラスが次のように見えるとしましょう:
class Frob {
public string Foo { get; set; }
public int Bar { get; set; }
public double FooBar { get; set; }
}
Frob
とFoo
が等しい場合にBar
の2つのインスタンスが等しいが、FooBar
は関係ないように、equalsを定義するとします。
次に、GetHashCode
とFoo
の観点からBar
を定義する必要があります。 1つの方法は次のとおりです。
return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode();
基本的に、平等を定義するすべてのフィールドを組み込むだけです。 1つの方法は、私がやったように、単に17を累積し乗算することです。それは高速で、シンプルで、正確で、通常は適切な分布を提供します。