Каждый объект в .net имеет заголовки (SyncBlockIndex
и MethodTablePointer
), а при вызове GetHashCode()
результат может быть сохранен в SyncBlockIndex
, если нет связаны SyncBlock к этому объекту, или в SyncBlock, если это так.ли хэш-код хранится в SyncBlockIndex/SyncBlock
Когда мы не переопределяем 0xхэш-код метода - это сохранение во время существования объекта, но как хэш-код будет храниться в случае возврата динамического хеш-кода (зависит от состояния объекта)?
Я знаю, что хэш-код должен быть таким же во время существования объекта, цель вопроса - понять, как хеш-код хранится в SyncBlockIndex или в SyncBlock.
Если вы пишете код с динамическим хеш-кодом, обязательно прочитайте «[Примечания для наследователей] (https://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx# Inheritors) "в MSDN *" В общем, для изменяемых типов ссылок вы должны переопределить GetHashCode только в том случае, если: • Вы можете вычислить хэш-код из полей, которые не изменяются, или • ** Вы можете убедиться, что хеш-код измененного объекта не изменяется, пока объект содержится в коллекции, которая опирается на свой хэш-код. ** «* –
Он очень сильно оптимизирован. Да, он может хранить хэш-код. Он также может хранить владельца блокировки и счет рекурсии, когда вы используете его в операторе * lock *. Невозможно сделать то и другое, если вы попросите его сделать то и другое, то он принимает третью роль, индекс синхронизации. Никогда не делай этого, это довольно сумасшедшее. Но поддерживается. –
Ганс, что значит «никогда не делать»? И индекс syncblock может хранить сгенерированный хеш-код (с не переопределенным методом) и некоторую дополнительную информацию, или может иметь указатель на SyncTableEntry, если слишком много информации, которая может быть сохранена в индексе синхронизации (тогда SyncTableEntry хранит хэш-код и дополнительную информацию) , я прав? –