Как работает object.gethashcode, когда GC перемещает объект?

StackOverflow https://stackoverflow.com/questions/1707471

  •  19-09-2019
  •  | 
  •  

Вопрос

Если я правильно понимаю, в .net реализация по умолчанию Object.GetHashCode() Возвращает значение на основе адреса памяти объекта (по крайней мере, для эталонных типов). Тем не менее, сборщик мусора может свободно перемещать объекты в памяти. Предположительно, хэш -код не меняется только потому, что GC перемещает объект, так что существует ли специальная обработка для этого взаимодействия, или мои предположения неправильно?

Это было полезно?

Решение

Это не возвращает значение на основе адреса. Он возвращает значение на основе блока синхронизации для объекта.

Блок синхронизации выделяется в первый раз object.GetHashCode называется (когда не переопределяется) или же В блокировке есть споры для объекта. (Это может быть выделено, если вы позвоните, ожидание/пульс/pulseall, я не смотрел.)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top