3

重複の可能性:
オーバーライドされた System.Object.GetHashCode に最適なアルゴリズムは何ですか?

これは、カスタム型でのEqualsメソッドをオーバーライドする場合、メソッドの実装もオーバーライドして提供し、コレクション クラスのサポートで使用する一意のハッシュ コードの生成をサポートする必要があることがわかっています。他のクラスの場合もあります。ObjectGetHashCodeHashtableDictionary

これにより、メソッド内で使用されるハッシュ アルゴリズムの実装overriden GetHashCodeが最適かつ正確であることが義務付けられます。つまり、型の一意のハッシュが生成され、型を使用するアプリケーションのパフォーマンスを向上させるために可能な限り迅速に行われます。

私の質問は、どのハッシュ アルゴリズムGetHashCodeが正確で、実装で使用したときに最適なパフォーマンスを提供するかということです。それとも、基本型のGetHashCode実装のみを使用する必要がありますか? value types私は両方のためにこの答えを知りたいreference types..

編集: オーバーライドする必要がある理由について、以下のクラスの例を示しますEquals

public class Laptop : LaptopBase
{
    public readonly string Make;
    public readonly string ProcessorArch;
    public readonly int MemorySupported;
    public readonly int HardDiskGBSupported;
    public readonly Color ColorName;

    public Laptop(make, procArch, memorySupp, hdGB, color)
    {
        Make = make;
        ProcessorArch = procArch;
        MemorySupported = memorySupp;
        HardDiskGBSupported = hdGB;
        ColorName = color;
    }
}

ここで、上記で定義されたすべてのフィールドが互いに一致する 2 つのラップトップ インスタンスに対して true を返したいので、EqualsandGetHashCodeメソッドをオーバーライドする必要があります。また、別の要件として、これが派生クラスであり、再さらに使用され、多くの方法をサポートします。したがって、値型 (構造体) にすることはできません。上記のタイプの 2 つのインスタンスをすべて一致するインスタンス フィールドで試してみましたが、基本実装を使用すると、必要な場所にEquals戻ります.. そのようなシナリオをどのようにサポートしますか?falsetrue

4

1 に答える 1

1

実装されている型によって異なりますが、値が適切に分散される必要があり、GetHashCode() が一意の値を返す必要はありません。Equals 実装で使用されるフィールドに基づいている必要があり、それらのフィールドは不変である必要があります。したがって、Equals/GetHashCode の要件は、構造体とクラスで同じです。

Henk が言ったように、Equals/GetHashCode をまったくオーバーライドしない方がよいでしょう...

于 2012-05-19T18:59:23.870 に答える