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

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


person Wesley Hill    schedule 10.11.2009    source источник


Ответы (1)


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

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

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

person Jon Skeet    schedule 10.11.2009