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

Хотя в настоящем примере мы не собираемся помещать объекты 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;

}


В случае использования в качестве основы хеш-кода свойства, допускающего чтение и запись, вы получите предупреждение. После того, как объект создан, хеш-код должен быть неизменяемым. В предыдущем примере свойство SSN имеет только метод get, что делает его допускающим только чтение, и устанавливать его можно только в конструкторе.

Если вы не можете отыскать единый фрагмент уникальных строковых данных, но есть переопределенный метод ToString, который удовлетворяет соглашению о доступе только по чтению, тогда вызывайте GetHashCode на собственном строковом представлении:


// Возвратить хеш-код на основе значения, возвращаемого

// методом ToString для объекта Person.

public override int GetHashCode => ToString.GetHashCode;

Тестирование модифицированного класса Person

Теперь, когда виртуальные члены класса Object переопределены, обновите операторы верхнего уровня, чтобы протестировать внесенные изменения:


Console.WriteLine("***** Fun with System.Object *****\n");

// ПРИМЕЧАНИЕ: мы хотим, чтобы эти объекты были идентичными

// в целях тестирования методов Equals и GetHashCode.

Person p1 = new Person("Homer", "Simpson", 50, "111-11-1111");

Person p2 = new Person("Homer", "Simpson", 50, "111-11-1111");

// Получить строковые версии объектов.

Console.WriteLine("p1.ToString = {0}", p1.ToString);

Console.WriteLine("p2.ToString = {0}", p2.ToString);

// Протестировать переопределенный метод Equals.

Console.WriteLine("p1 = p2?: {0}", p1.Equals(p2));

// Протестировать хеш-коды.

// По-прежнему используется хеш-значение SSN

Console.WriteLine("Same hash codes?: {0}", p1.GetHashCode == p2.GetHashCode);

Console.WriteLine;

// Изменить значение Age объекта p2 и протестировать снова.

p2.Age = 45;

Console.WriteLine("p1.ToString = {0}", p1.ToString);

Console.WriteLine("p2.ToString = {0}", p2.ToString);

Console.WriteLine("p1 = p2?: {0}", p1.Equals(p2));

// По-прежнему используется хеш-значение SSN

Console.WriteLine("Same hash codes?: {0}", p1.GetHashCode == p2.GetHashCode);

Console.ReadLine;


Ниже показан вывод:


***** Fun with System.Object *****

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

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT