Здесь производится сравнение значений входного объекта с внутренними значениями текущего объекта (обратите внимание на применение ключевого слова this
true
. Любые другие результаты приводят к возвращению false
.Хотя такой подход действительно работает, вы определенно в состоянии представить, насколько трудоемкой была бы реализация специального метода Equals()
ToString()
. Если класс располагает подходящей реализацией ToString()
, в которой учитываются все поля данных вверх по цепочке наследования, тогда можно просто сравнивать строковые данные объектов (проверив на равенство null
):// Больше нет необходимости приводить obj к типу Person,
// т.к. у всех типов имеется метод ToString().
public override bool Equals(object obj)
=> obj?.ToString() == ToString();
Обратите внимание, что в этом случае нет необходимости проверять входной аргумент на принадлежность к корректному типу (Person
ToString()
поддерживают все типы .NET. Еще лучше то, что больше не требуется выполнять проверку на предмет равенства свойство за свойством, т.к. теперь просто проверяются значения, возвращаемые методом ToString()
.Переопределение метода System.Object.GetHashCode()
В случае переопределения в классе метода Equals()
GetHashCode()
. Выражаясь упрощенно, string
, хранящие значение Hello
, то они должны давать один и тот же хеш-код. Однако если одна из них хранит строку в нижнем регистре (hello
), то должны получаться разные хеш-коды.Для выдачи хеш-значения метод System.Object.GetHashCode()
Hashtable
(из пространства имен System.Collections
), тогда всегда должны переопределять данный член, потому что для извлечения объекта тип Hashtable
будет вызывать методы Equals()
и GetHashCode()
.На заметку!
Говоря точнее, классSystem.Collections.Hashtable
внутренне вызывает метод GetHashCode()
, чтобы получить общее представление о местоположении объекта, а с помощью последующего (внутреннего) вызова метода Equals()
определяет его точно.Хотя в настоящем примере мы не собираемся помещать объекты Person
System.Collections.Hashtable
, ради полноты изложения давайте переопределим метод GetHashCode()
. Существует много алгоритмов, которые можно применять для создания хеш-кода, как весьма изощренных, так и не очень. В большинстве ситуаций есть возможность генерировать значение хеш-кода, полагаясь на реализацию метода GetHashCode()
из класса System.String
.Учитывая, что класс String
String
, вы можете просто вызвать метод GetHashCode()
с той частью полей данных, которая должна быть уникальной во всех экземплярах (вроде номера карточки социального страхования), если ее удается идентифицировать. Таким образом, если в классе Person
определено свойство SSN
, то вы могли бы написать следующий код:// Предположим, что имеется свойство SSN.
class Person
{
public string SSN {get; } = "";
public Person(string fName, string lName, int personAge,
string ssn)
{
FirstName = fName;
LastName = lName;
Age = personAge;
SSN = ssn;
}
// Возвратить хеш-код на основе уникальных строковых данных.
public override int GetHashCode() => SSN.GetHashCode();
}