Должен ли .GetHashCode () возвращать одно и то же значение для двух объектов, имеющих разные ссылки в памяти? - PullRequest
4 голосов
/ 05 сентября 2011

Мне нужно переопределить метод Equals () для одного из моих типов, но, похоже, мне также нужно переопределить метод GetHashCode ().

Я не уверен:

Если у меня есть типЖивотное, и если у меня есть 2 экземпляра Животного, которые в основном одинаковые (равные) Кошки;например:

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

Должен ли я реализовать GetHashedCode (), чтобы перенаправить одно и то же значение для обоих cas_01 и cat_02, хотя они представляют разные ссылки в памяти?работа?

Спасибо

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

MSDN говорит :

Если два объекта сравниваются как равные, метод GetHashCode для каждого объекта должен возвращать одно и то же значение.

Такда, GetHashCode должен возвращать одинаковое значение для обоих экземпляров.

Вы все еще можете использовать Object.ReferenceEquals, если хотите увидеть, ссылаются ли они на один и тот же объект.

3 голосов
/ 05 сентября 2011

Я бы не согласился с другими ответами. Животное в этом примере не является ценностным объектом, вполне возможно, что две кошки могут иметь одинаковое имя и цвет и быть совершенно разными сущностями. Логично, что вы говорите: «Эта кошка и эта кошка имеют одно и то же имя и один и тот же цвет, поэтому они - одна и та же кошка», что не обязательно соответствует действительности.

Я хотел бы предложить вам оставить Animal.Equals для реализации по умолчанию и создать отдельную реализацию IEqualityComparer, которая возвращает true, если животные имеют одинаковое имя / цвет.

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();
    }
}

Постарайтесь запомнить, что существует множество разных способов сравнить кошку, и одного метода "равно" недостаточно:)

// 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...
1 голос
/ 05 сентября 2011

В зависимости от дизайна модели, если это объект-значение (неизменяемый), то gethashcode должен возвращать хешированное значение всех полей, но с другой стороны, если это объект домена, он должен иметь идентификатор иэту идентичность следует использовать для сравнения и получения хэш-кода (два человека с одинаковым именем и возрастом не совпадают, если у вас есть две кошки с одинаковым именем, что не означает, что они являются одной и той же кошкой!).

check: http://moh -abed.com / 2011/07/13 / объекты-значения-объекты /

...