Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save eterekhin/d058335b78cc7e3ac6bcb82a6c044983 to your computer and use it in GitHub Desktop.
Save eterekhin/d058335b78cc7e3ac6bcb82a6c044983 to your computer and use it in GitHub Desktop.

1) Почему если переопределяешь Equals нужно переопределить GetHashCode?

Потому что каждый объект в C# можно поместить в виде ключа хэш таблицу, которая устроена так(объясняется устройство Dictionary<Key,Value>) Вычисляется хэш код объекта-ключа посредством вызова метода GetHashCode, далее по остатку от деления на количество корзин в словаре, объект помещается в корзину, в процессе возникают коллизии, т.е в одной корзине может лежать несколько объектов и тогда для поиска выбранного объекта при вызове dic[Key]:

  1. будет вызван GetHashCode объекта Key
  2. полученный хэш код будет взят по модулю количества корзин
  3. Будет выполнен проход по корзине и поиск нужного ключа, и если Equals не переопределен и указывает на адрес в памяти(ссылка), то при структурном определении GetHashCode, объект вообще не найдется, так как у двух экземпляров классов с одинаковыми поляеми разные ссылки, GetHashCode вернут одинаковые значения, но вызовы Equals - вернут false

2) Почему нельзя сохраняться хеши объектов для дальнейшего использования?

Потому что реализация хэш функции для базовых типов языка (string,long,decimal) может измениться и в итоге все сохраненные хэш-коды станут невалидными

3) Почему нельзя изменить значение ключа, который уже добавлен в Hashtable?

Если это сделать то получится, что объект лежит уже не в той корзине, потому что если бы ключ был изменен до добавления, то хэш код был бы уже другой. При dic[Key](где Key - изменненный ключ) будет выполнен поиск по другой корзине, в итоге объект не будет найден и выброшено исключение

4) Вспомнить правила переопределения GetHashCode

  1. Детерминирован
  2. При вызове на все возможных объектах значение хэш кодов распределяется равномерно
  3. Выполняется быстро
  4. В формировании ответа участвуют только readonly поля, так как иначе может произойти описанное в пункте 3, если кто-то изменит поле учатсвующее в вычислении функции GetHashCode окажется, значение хэш-кода при поиске по ключу изменится
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment