Теми рефератів
> Реферати > Курсові роботи > Звіти з практики > Курсові проекти > Питання та відповіді > Ессе > Доклади > Учбові матеріали > Контрольні роботи > Методички > Лекції > Твори > Підручники > Статті Контакти
Реферати, твори, дипломи, практика » Курсовые проекты » Реалізація інтерфейсу IComparer

Реферат Реалізація інтерфейсу IComparer





що повертається цим методом, використовується словником для обчислення індексу, куди поміщений елемент. [2]

Реалізація методу GetHashCode () повинна задовольняти перерахованим нижче вимогам:

) Один і той же об'єкт повинен завжди повертати одне і те ж значення;

) Різні об'єкти можуть повертати одне і те ж значення;

) Він повинен виконуватися наскільки можливо швидко, не вимагаючи значних обчислювальних витрат;

) Він не повинен генерувати виключень;

) Він повинен використовувати як мінімум одне поле примірника;

) Значення хеш-коду повинні розподілятися рівномірно по всьому діапазону чисел, які може зберігати int;

) Хеш-код не повинен змінюватися протягом часу існування об'єкта.

Хороша продуктивність словника заснована на хорошій реалізації методу GetHashCode (). [2]

Якщо два ключі повертають хеш-значення, що дають один і той же індекс, клас словника змушений шукати найближче доступне вільне місце для збереження другого елементу, до того ж йому доведеться виконувати деяке пошук, щоб згодом витягти необхідну значення. Це завдає шкоди продуктивності, і якщо безліч ключів дають одні й ті ж індекси, куди їх слід помістити, ймовірність конфліктів значно зростає. Однак завдяки способу, яким працює частина алгоритму, що належить Microsoft, ризик знижується до мінімуму, коли обчислюване значення хеш-коду рівномірно розподілено між int.MinValue і int.MaxValue. [2]

Крім реалізації GetHashCode () тип ключа також має реалізовувати метод IEquatable lt; T gt; .Equals () або перевизначати метод Equals () класу Object. Оскільки різні об'єкти ключа можуть повертати один і той же хеш-код, метод Equals () використовується при порівнянні ключів словника. Словник перевіряє два ключі А і В на еквівалентність, викликаючи A.Equals (В). Це означає, що буде потрібно забезпечити істинність наступного твердження:

Якщо істинно А.Equals (В), значить, А.GetHashCode () і В.GetHashCode () завжди повинні повертати один і той же хеш-код. [2]

Якщо буде обраний такий спосіб перевизначення цих методів, що наведене твердження не завжди буде істинним, то словник, який використовує екземпляри такого класу в якості ключів не буде правильно працювати. Напри?? ер, після приміщення об'єкта в словник його не можна буде витягти, або при спробі витягти елемент, буде отриманий не той, який потрібен.

З цієї причини компілятор С # відображатиме попередження, якщо ви перевизначите Equals (), але не представите перевизначення GetHashCode (). [3]

Для System. Object ця умова істинно, оскільки Equals () просто порівнює посилання, a GetHashCode () насправді повертає хеш-код, заснований виключно на адресі об'єкта. Це означає, що хеш-таблиці, засновані на ключі не переважають ці методи, працюватимуть коректно. Однак проблема такого підходу полягає в тому, що ключі трактуються як еквівалентні тільки в тому випадку, якщо вони представляють один і той самий об'єкт. Це означає, що коли при приміщенні об'єкта в словник, обов'язково потрібно звертатися до посилань на ключ. Можливості просто пізніше створити екземпляр іншого ключового об'єкту з тим самим значенням немає. Якщо не перевизначити Equals () і GetHashCode (), то тип буде не дуже зручним для використання в словнику. [6] .String реалізує інтерфейс IEquatable і відповідно перевизначає GetHashCode (). Equals () забезпечує порівняння значень, а GetHashCode () повертає хеш-код, заснований на значенні рядка. Рядки з успіхом можуть використовуватися в якості ключів в словниках. [6]

Числові типи, такі як Int32, також реалізують інтерфейс IEquatable і перевантажують GetHashCode (). Однак хеш-код, що повертається цими типами, просто відображає значення. Якщо число, яке потрібно використовувати в якості ключа, саме по собі не розподілено по всьому діапазону можливих цілочисельних значень, застосування цілих як ключів не відповідає правилу рівномірного розподілу ключових значень для отримання найкращої продуктивності. Int32 не призначений для використання в словнику. [3]

Якщо потрібно використовувати тип ключа, який не реалізує IEquatable і не перевизначає GetHashCode відповідно значенням ключа, що його записала в словнику, то є можливість створити компаратор, який реалізує інтерфейс IEqualityComparer lt; T gt ;. IEqualityComparer lt; T gt; визначає методи GetHashCode () і Equals () з аргументом - переданим об'єктом, так що ви можете надати реалізацію, відмінну від типу самого об'єкта. Перевантаження конструктора Dictionary lt; TKey, TValue gt; дозволяє передати об'єкт, який реалізує IEqualityComparer lt; T gt ;. Якщо такий об'єкт привласнений словником, цей кл...


Назад | сторінка 8 з 21 | Наступна сторінка





Схожі реферати:

  • Реферат на тему: Розробка термогенератора, який буде використовувати тепло двигуна для заряд ...
  • Реферат на тему: Якщо лікарняний невірно розрахований
  • Реферат на тему: Якщо ви викликаєте швидку допомогу
  • Реферат на тему: Якщо ремонт виявився модернізацією
  • Реферат на тему: Якщо ваш працівник затриманий чи засуджений