Подтвердить что ты не робот

С#: Как статический объект .Equals проверяет равенство?

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

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

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

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

4b9b3361

Ответ 1

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

  • Проверьте ссылочное равенство (верните true, если да)
  • Проверьте ссылочную недействительность (верните false, если значение равно NULL, к тому же был обработан случай null == null)
  • Проверьте равенство значений с помощью first.Equals(second)

Упорядочение не должно иметь значения, если оба значения имеют хорошо выполненные реализации равенства, поскольку равенство должно быть реализовано таким образом, что x.Equals(y) подразумевает y.Equals(x). Однако автономная документация, которую я установил, указывает на то, что first.Equals(второй) (или 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.
}

Ответ 2

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

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

Вы можете перегрузить операторы для создания этой функции.