4

タイプの1つでEquals()メソッドをオーバーライドする必要がありますが、GetHashCode()メソッドもオーバーライドする必要があるようです。

私はわかりません:

私がAnimalタイプを持っていて、基本的に同じ(等しい)猫であるAnimalのインスタンスが2つある場合。お気に入り:

Animal cat_01 = new Animal("Kitty", "Pink");
Animal cat_02 = new Animal("Kitty", "Pink");

GetHashedCode()を実装して、cas_01とcat_02の両方がメモリ内の異なる参照を表している場合でも、同じ値を返す必要がありますか?

GetHashCode()が機能する方法ですか?

ありがとう

4

3 に答える 3

4

MSDN は次のように述べています

2 つのオブジェクトを比較して等しい場合、各オブジェクトの GetHashCode メソッドは同じ値を返す必要があります。

そうです、GetHashCode は両方のインスタンスに対して同じ値を返す必要があります。

それらが同じオブジェクトを参照しているかどうかを確認したい場合は、引き続き Object.ReferenceEquals を使用できます。

于 2011-09-05T12:11:33.397 に答える
3

私は他の答えに同意しません..この例の動物は値オブジェクトではありません.2匹の猫が同じ名前と色を持ち、完全に異なるエンティティであることは完全に実現可能です。論理的には、「この猫とあの猫は同じ名前と同じ色を持っているため、同じ猫です」と言っていますが、これは必ずしも真実ではありません..

Animal.Equals をデフォルトの実装のままにし、動物の名前/色が同じ場合に true を返す別の IEqualityComparer 実装を作成することをお勧めします。

public class AnimalNameColorComparer : IEqualityComparer<Animal>
{
    public bool Equals(Animal a, Animal b)
    {
        return a.Name == b.Name &&
               a.Color == b.Color
    }

    public int GetHashCode(Animal a)
    {
        return a.Name.GetHashCode() ^ a.Color.GetHashCode();
    }
}

猫を比較するにはさまざまな方法があり、1 つの "Equals" メソッドでは不十分であることを覚えておいてください:)

// Create two black cats called fluffy...
var cat1 = new Cat("Fluffy", "Black");
var cat2 = new Cat("Fluffy", "Black");

cat1.Equals(cat2) == false; // they are not the same cat!

var comparer = new AnimalNameColorComparer();

comparer.Equals(cat1, cat2) == true; // But they do have the same name & colour...
于 2011-09-05T12:22:11.913 に答える
1

モデルの設計によっては、値オブジェクト (不変) の場合、gethashcode はすべてのフィールドのハッシュ値を返す必要がありますが、ドメイン エンティティの場合は ID が必要であり、この ID は必要です。比較と gethashcode で使用されます (同じ名前と年齢の 2 人は同じではありません。同じ名前の猫が 2 匹いる場合、同じ猫であるとは限りません!)。

チェック: http://moh-abed.com/2011/07/13/entities-and-value-objects/

于 2011-09-05T13:23:29.287 に答える