2

重複の可能性:
C#でEqualsメソッドをオーバーライドするときにGetHashCodeをオーバーライドすることが重要なのはなぜですか?

私は自分の中で次のクラスを調べていましたが、Object Modelを追加することの重要性を理解できませんでしGetHashCode()Class

サンプルクラス

public class SampleClass
{

    public int ID { get; set; }
    public String Name { get; set; }
    public String SSN_Number { get; set; }

    public override bool Equals(Object obj)
    {
        if (obj == null || GetType() != obj.GetType())
            return false;

        SampleClass cls = (SampleClass)obj;
        return (ID == cls.ID) &&
               (Name == cls.Name) &&
               (SSN_Number == cls.SSN_Number);
    }

    public override int GetHashCode()
    {
        return ID.GetHashCode() ^ Name.GetHashCode() ^ SSN_Number.GetHashCode();
    }
}

オブジェクトのリストがありSample Class、特定のインデックスを取得したいとします。その後Equals()、私がその記録を取得するのを助けることができます。なぜ使用する必要がありますGetHashCode()か?

4

2 に答える 2

0

GetHashCode()は、Equalsメソッドと連携して多くのコレクション実装(Dictionaryなど)で使用されるため、両方を処理する必要があります。重要なことは、Equalsの実装をオーバーライドする場合は、新しい実装に従ってEqualである2つのオブジェクトも同じハッシュコードを返すようにGetHashCodeをオーバーライドする必要があるということです。

そうしないと、Dictionaryで正しく機能しません。一般的にはそれほど難しいことではありません。私がよくこれを行う1つの方法は、同等性のために使用するオブジェクトのプロパティを取得し、それらをStringオブジェクトに結合してから、String.GetHashCodeを返すことです。

Stringには、GetHashCodeの非常に優れた実装があり、さまざまな値に対して広範囲の整数を返し、スパースコレクションで適切なスプレッドを実現します。

于 2012-06-21T16:12:08.327 に答える
0

GetHashCodeカスタム クラスが をオーバーライドする場合は、 にオーバーライドを提供する必要がありますEquals。を省略するGetHashCodeと、「パブリック型は System.Object.Equals をオーバーライドしますが、System.Object.GetHashCode をオーバーライドしません」というコンパイラ警告が表示されます。

GetHashCode は、ハッシュ アルゴリズムやハッシュ テーブルなどのデータ構造に適した現在のインスタンスに基づく値を返します。System.Collections.HashTableおよびのインスタンスがSystem.Collections.Generic.Dictionary<TKey, TValue>正しく機能するようにするには、同じ型で等しい 2 つのオブジェクトが同じハッシュ コードを返す必要があります。

カスタム クラスでをオーバーライドする必要がないと仮定するとGetHashCode、ハッシュ ベースのコレクションは基本クラスを使用する必要がObject.GetHashCodeあり、カスタム クラスのすべてのインスタンスに対して正しい結果が得られない可能性があります。

投稿したコードを確認すると、Equalsメソッドが比較 され、2 つのインスタンスが等しい結果を返し、同じ属性がメソッド内のハッシュ アルゴリズム (ID^Name^SSN) に使用されています。IDNameSSNGetHashCode

于 2012-06-21T16:13:43.723 に答える