При переопределении метода ToString
ToString из родительского класса, используя ключевое слово base. После получения строковых данных родительского класса их можно дополнить специальной информацией производного класса.Переопределение метода System.Object.Equals
Давайте также переопределим поведение метода Object.Equals
Equals возвращает true, только если два сравниваемых объекта ссылаются на один и тот же экземпляр объекта в памяти. Для класса Person может оказаться полезной такая реализация Equals, которая возвращает true, если две сравниваемые переменные содержат те же самые значения состояния (например, фамилию, имя и возраст).Прежде всего, обратите внимание, что входной аргумент метода Equals
System.Object. В связи с этим первым делом необходимо удостовериться в том, что вызывающий код действительно передал экземпляр типа Person, и для дополнительной подстраховки проверить, что входной параметр не является ссылкой null.После того, как вы установите, что вызывающий код передал выделенный экземпляр Person
Equals для сравнения поле за полем данных входного объекта с данными текущего объекта:public override bool Equals(object obj)
{
if (!(obj is Person temp))
{
return false;
}
if (temp.FirstName == this.FirstName
&& temp.LastName == this.LastName
&& temp.Age == this.Age)
{
return true;
}
return false;
}
Здесь производится сравнение значений входного объекта с внутренними значениями текущего объекта (обратите внимание на применение ключевого слова 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 определяет его точно.Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT