Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Блок синхронизации выделяется при первом вызове object.GetHashCode (если он не переопределен) или существует конфликт на блокировке для объекта. (Это может быть выделено, если вы вызываете Wait/Pulse/PulseAll тоже, я не смотрел.)

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