Каковы лучшие практики для реализации оператора == для класса в C #? - PullRequest
6 голосов
/ 06 октября 2009

При реализации оператора == у меня возникает ощущение, что я упускаю некоторые важные моменты.
Поэтому я ищу некоторые лучшие практики вокруг этого.
Вот некоторые связанные вопросы, о которых я думаю:

  • Как правильно обработать эталонное сравнение?
  • Должен ли он быть реализован через IEquatable<T> -подобный интерфейс? Или переопределение object.Equals?
  • А как насчет оператора !=?

(этот список может быть не исчерпывающим).

Ответы [ 4 ]

10 голосов
/ 06 октября 2009

Я бы следовал рекомендациям Microsoft по перегрузке Equals () и Operator == .

edit : рекомендации Microsoft содержат это важное замечание, которое, кажется, подтверждает ответ Хенка:

По умолчанию оператор == проверяет равенство ссылок определение, указывают ли две ссылки на один и тот же объект, поэтому ссылка типы не должны реализовывать оператор ==, чтобы получить это функциональность. Когда тип является неизменным, то есть данные, содержащиеся в экземпляр нельзя изменить, перегружая оператор == для сравнения Значение равенства вместо ссылочного равенства может быть полезным, потому что, как неизменяемые объекты, их можно считать одинаковыми до тех пор, пока они имеют одинаковое значение. Переопределяющий оператор == в неизменяемых типах не рекомендуется

4 голосов
/ 06 октября 2009

Каждый раз, когда вы реализуете оператор ==, не забудьте также реализовать !=, IEquatable<T> и переопределить Object.Equals() и Object.GetHashCode() для согласованности для пользователя вашего класса.

Рассматривая класс, вот моя обычная реализация:

    public bool Equals(MyClass other) {
        if (ReferenceEquals(other, null))
            return false;
        if (ReferenceEquals(other, this))
            return true;
        return // your equality code here
    }

    public override bool Equals(object obj) {
        return Equals(obj as MyClass);
    }

    public override int GetHashCode() {
        return // your hash function here
    }

    public static bool operator ==(MyClass left, MyClass right) {
        return Equals(left, right);
    }

    public static bool operator !=(MyClass left, MyClass right) {
        return !(left == right);
    }
3 голосов
/ 06 октября 2009

Наиболее распространенный подход - , а не , чтобы справиться с этим. По умолчанию используется сравнение ссылок, которое в целом подходит для объектов класса.

Итак, сначала вы хотите быть уверены, что вам нужно поведение типа значения.

3 голосов
/ 06 октября 2009
  • Если вы реализуете ==, переопределите .Equals и. GetHashCode
  • реализовать! = А также
  • Проверка на нулевые ссылки с использованием object.ReferenceEquals, в противном случае оператор получит
...