books-read.com
books-read.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Наш ресурс дает возможность бесплатно читать книгу онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных . Сайт books-read.com дает возможность читать полную версию книги без регистрации и sms. Все книги онлайн, не надо качать fb2, epub, txt.
Добавить книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю в приложение ЧИТАТЬ КНИГУ ОФЛАЙН в приложении ios/android
Перейти на страницу:

При переопределении метода

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()
определяет его точно.

Хотя в настоящем примере мы не собираемся помещать объекты

Person
внутрь
System.Collections.Hashtable
, ради полноты изложения давайте переопределим метод
GetHashCode()
. Существует много алгоритмов, которые можно применять для создания хеш-кода, как весьма изощренных, так и не очень. В большинстве ситуаций есть возможность генерировать значение хеш-кода, полагаясь на реализацию метода
GetHashCode()
из класса
System.String
.

Учитывая, что класс

String
уже имеет эффективный алгоритм хеширования, использующий для вычисления хеш-значения символьные данные объекта
String
, вы можете просто вызвать метод
GetHashCode()
с той частью полей данных, которая должна быть уникальной во всех экземплярах (вроде номера карточки социального страхования), если ее удается идентифицировать. Таким образом, если в классе
Person
определено свойство
SSN
, то вы могли бы написать следующий код:

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - на сайте онлайн книг books-read.com Вы можете читать полные версии книг автора в одном месте.


Язык программирования C#9 и платформа .NET5 отзывы

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор books-read.com


Прокомментировать
Подтвердите что вы не робот:*