[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
Це пов’язано з тим, що фреймворк вимагає, щоб два однакові об’єкти мали однаковий хеш-код. Якщо ви перевизначите метод equals для спеціального порівняння двох об’єктів, і ці два об’єкти вважатимуться методом однаковими, то хеш-код цих двох об’єктів також має бути однаковим. (Словники та хеш-таблиці покладаються на цей принцип).
Перевизначати GetHashCode важливо, якщо ваш елемент буде використовуватися як ключ у Dictionary, або HashSet, тощо. – оскільки він використовується для групування елементів і подальшого пошуку. Якщо хеш-код для двох елементів не збігається, вони ніколи не вважатимуться рівними (функція Equals просто ніколи не буде викликана).
Розглянемо на невеликому прикладі:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Person { public string Name { get; set; } public int Age { get; set; } public override int GetHashCode() { return HashCode.Combine(Name, Age); } public override bool Equals(object? obj) { if(obj is Person person) { return person.Equals(Name) && person.Age == Age; } return false; } } |
Насправді дуже складно правильно реалізувати GetHashCode(), тому що, на додаток до вже згаданих правил, хеш-код не повинен змінюватися протягом життя об’єкта. Тому поля, які використовуються для обчислення хеш-коду, мають бути незмінними.