33

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

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

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

4

6 に答える 6

29

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

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

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

于 2010-12-02T16:52:47.413 に答える
27

オーバーライドするときは、 、およびGetHashCode()もオーバーライドする必要があります。そして、これらのメソッドのすべての要件を満たすように十分注意してください。Equals()operator==operator!=

ガイドラインはMSDN にあります。最も重要な引用:

変更可能な型で operator == をオーバーライドすることはお勧めできません。

于 2010-11-21T22:07:51.860 に答える
1

私は通常、データクラス(つまり、値のセマンティクスが意味をなすクラス)のハッシュコードと等価性チェックメソッドをオーバーライドします。一般的な実装については、この質問をご覧ください。ハッシュコードをオーバーライドする場合は、equalsをオーバーライドします。GUIDを使用するのはかなりひどい考えです。これは、インスタンスは異なるがが同じである2つのオブジェクトが同じハッシュコードを持ち、equalsがtrueを返すようにするためです。

于 2010-11-21T21:43:42.270 に答える
1

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

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

HTH。

于 2010-11-21T21:33:03.873 に答える
0

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

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

実際には、IDEがこれを行う必要があります。「overrideGetHashCode」と入力すると、IDEはこの定型コードを生成する必要があります。Visual Studioはそれを行いませんが、SharpDevelopは行います。

于 2010-11-21T21:41:45.233 に答える
-2

通常、クラスのコンポーネント プロパティから集約された GetHashCode を使用します。例えば

public class Test
{
  public string Text { get; set; }
  public int Age { get; set; }

  public override GetHashCode()
  {
    int result = 
      string.IsNullOrEmpty(Text) ? 0 : Text.GetHashCode()
      + Age.GetHashCode();

    return result;
  }
}
于 2010-11-21T21:30:41.320 に答える