C # GetHashCode / Equals переопределение не вызывается - PullRequest
8 голосов
/ 07 ноября 2010

Я столкнулся с проблемой с GetHashCode и Equals, которую я переопределил для класса. Я использую оператор ==, чтобы проверить, равны ли они оба, и я ожидаю, что это вызовет оба метода GetHashCode и Equals, если их хэш-код одинаков для проверки того, что они действительно равны.

Но, к моему удивлению, ни один из них не был вызван, и результат теста на равенство ложен (хотя на самом деле он должен быть истинным).

Код отмены:

    public class User : ActiveRecordBase<User>

        [...]

        public override int GetHashCode()
        {
            return Id;
        }

        public override bool Equals(object obj)
        {
            User user = (User)obj;
            if (user == null)
            {
                return false;
            }

            return user.Id == Id;
        }
    }

Проверка на равенство:

    if (x == y) // x and y are both of the same User class
    // I'd expect this test to call both GetHashCode and Equals

Ответы [ 2 ]

11 голосов
/ 07 ноября 2010

Оператор == полностью отделен от .GetHashCode() или .Equals().

Возможно, вас заинтересуют рекомендации Microsoft по перегрузке Equals () и Operator == .

Краткая версия: Используйте .Equals() для реализации равенства сравнения.Используйте оператор == для идентификации сравнений или если вы создаете неизменный тип (где каждый равный экземпляр может считаться фактически идентичным).Кроме того, .Equals() является виртуальным методом и может быть переопределен подклассами, но оператор == зависит от типа выражения во время компиляции, в котором он используется.

Наконец, чтобы быть последовательным, реализуйте .GetHashCode() каждый раз, когда вы реализуете .Equals().Оператор перегрузки != каждый раз, когда вы перегружаете оператора ==.

1 голос
/ 07 ноября 2010

возможно добавление еще одного метода в ваш User класс.

    public virtual bool Equals(User other) 
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return other.Id == Id;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...