C #: Как статический объект. Эквалайзеры проверяют равенство? - PullRequest
21 голосов
/ 20 сентября 2009

Допустим, у вас есть два разных класса, каждый из которых имеет собственную реализацию Equals; какой используется? Что делать, если только один из них есть? Или никто из них? Являются ли какие-либо из следующих строк эквивалентными?

object .Equals( first, second )
first .Equals( second )
second .Equals( first )

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

Что это действительно делает?

Ответы [ 2 ]

40 голосов
/ 20 сентября 2009

В основном это делает три вещи:

  • Проверка на равенство ссылок (верните true, если так)
  • Проверка на нулевую ссылку (возвращает false, если любое из значений равно нулю; к настоящему моменту обработан нулевой == нулевой регистр)
  • Проверка на равенство значений с first.Equals(second)

Порядок не должен иметь значения , если оба значения имеют хорошо реализованные реализации равенства, поскольку равенство должно быть реализовано таким образом, чтобы x.Equals(y) подразумевало y.Equals(x). Однако в автономной документации, которую я установил, указано, что first.Equals (second) (или objA.equals (objB) для использования реального именования параметров) указан. онлайн документация не упоминает об этом, достаточно интересно.

Просто чтобы сделать все это конкретным, реализация может выглядеть следующим образом:

public static bool Equals(object x, object y)
{
    if (x == y) // Reference equality only; overloaded operators are ignored
    {
        return true;
    }
    if (x == null || y == null) // Again, reference checks
    {
        return false;
    }
    return x.Equals(y); // Safe as we know x != null.
}
1 голос
/ 20 сентября 2009

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

Однако это может быть перегружено внутри объекта, так что разработчики могут сравнивать два объекта, которые не в одной и той же ячейке памяти, и при этом считаться равными. Например, если у вас есть уровень доступа к данным, где каждый объект имеет свой идентификатор записи данных из базы данных, вы можете сравнить объекты на основе идентификатора.

Вы можете перегрузить операторов , чтобы получить эту функцию.

...