2015-12-02 2 views
2

Каждый объект в .net имеет заголовки (SyncBlockIndex и MethodTablePointer), а при вызове GetHashCode() результат может быть сохранен в SyncBlockIndex, если нет связаны SyncBlock к этому объекту, или в SyncBlock, если это так.ли хэш-код хранится в SyncBlockIndex/SyncBlock

Когда мы не переопределяем 0xхэш-код метода - это сохранение во время существования объекта, но как хэш-код будет храниться в случае возврата динамического хеш-кода (зависит от состояния объекта)?

Я знаю, что хэш-код должен быть таким же во время существования объекта, цель вопроса - понять, как хеш-код хранится в SyncBlockIndex или в SyncBlock.

+1

Если вы пишете код с динамическим хеш-кодом, обязательно прочитайте «[Примечания для наследователей] (https://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx# Inheritors) "в MSDN *" В общем, для изменяемых типов ссылок вы должны переопределить GetHashCode только в том случае, если: • Вы можете вычислить хэш-код из полей, которые не изменяются, или • ** Вы можете убедиться, что хеш-код измененного объекта не изменяется, пока объект содержится в коллекции, которая опирается на свой хэш-код. ** «* –

+1

Он очень сильно оптимизирован. Да, он может хранить хэш-код. Он также может хранить владельца блокировки и счет рекурсии, когда вы используете его в операторе * lock *. Невозможно сделать то и другое, если вы попросите его сделать то и другое, то он принимает третью роль, индекс синхронизации. Никогда не делай этого, это довольно сумасшедшее. Но поддерживается. –

+0

Ганс, что значит «никогда не делать»? И индекс syncblock может хранить сгенерированный хеш-код (с не переопределенным методом) и некоторую дополнительную информацию, или может иметь указатель на SyncTableEntry, если слишком много информации, которая может быть сохранена в индексе синхронизации (тогда SyncTableEntry хранит хэш-код и дополнительную информацию) , я прав? –

ответ

4

как хэш-код будет храниться в случае возврата динамического хеш-кода (зависит от состояния объекта)?

Если хэш-код динамически вычисляется с помощью переопределения GetHashCode это не хранится где-нибудь ...

Использование SyncBlockIndex в качестве «по умолчанию» хэш-код для объекта является деталью реализации и должны не следует полагаться на что-либо вне рамок.