web-dev-qa-db-ja.com

GetHashCodeのオーバーライド

ご存じのように、GetHashCodeは、コレクション内のオブジェクトインスタンスを識別するために使用できる半一意の値を返します。良い方法として、このメソッドをオーバーライドして独自のメソッドを実装することをお勧めします。

私の質問は-カスタムオブジェクトで作業するときにこのメソッドをオーバーライドしますか?その場合、一意のIDを生成するためにどのアルゴリズムを使用しますか?

GUIDを生成し、その識別子から整数データを取得することを考えていました。

31
Den Delimarsky

GetHashCode()をオーバーライドする場合、Equals()operator==およびoperator!=。そして、これらのメソッドのすべての要件を満たすように非常に注意してください。

ガイドラインは ここではMSDN です。最も重要な引用:

不変でない型で演算子==をオーバーライドすることはお勧めできません。

25
Henk Holterman

Resharperを使用する場合、GetHashCode()、Equals、および演算子メソッド本体を生成できます。

を押してこのメ​​ニューにアクセスします Alt+Insert

http://www.jetbrains.com/resharper/webhelp/Code_Generation__Equality_Members.html

29
Winston

私の使用法では、equalsメソッドもオーバーライドする場合にのみオーバーライドします。通常、これは、LINQ to Objectsクエリまたは他の比較操作を実行する可能性があることがわかっているオブジェクトに対して行います。

通常、LINQ to SQLエンティティまたはDTOオブジェクトの場合、主キー値を返します。何を返すにしても、値をローカルに保存しないと、予期しない結果が生じる可能性があります。

HTH。

1
Brian Mains

私は通常、データクラス(つまり、値のセマンティクスが理にかなっているクラス)のハッシュコードと等値チェックメソッドをオーバーライドします。一般的な実装に関する this の質問をご覧ください。ハッシュコードをオーバーライドする場合、オーバーライドは等しいです。 GUID=を使用するのは非常に恐ろしい考えです。なぜなら、異なるインスタンスであるが同じvalueを持つ2つのオブジェクトが必要だからです。同じハッシュコードを持ち、等しい場合にtrueを返します。

1
brain

equalsをオーバーライドする場合にのみGetHashCodeをオーバーライドする必要があります。デフォルトのGetHashCodeは、ランタイムと同様の方法でランタイムによって実装されます。すべてのオブジェクトには、ランタイムによって割り当てられた非表示フィールドがあります。

GetHashCodeをオーバーライドする方法

実際にIDEはこれを行う必要があります-「GetHashCodeをオーバーライドする」と入力すると、IDEはこの定型コードを生成する必要があります。VisualStudioはこれを行いませんが、 SharpDevelop します。

0
Martin Konicek