Как хеш реализован в .NET?

Возможный дубликат:
Как работает Object.GetHashCode, когда GC перемещает объект?

Сборщик мусора в .NET перемещает объекты, поэтому адрес объекта нестабилен. Как реализован метод Object GetHashCode()?

Спасибо!


person fish    schedule 03.08.2010    source источник
comment
Метод GetHashCode не имеет ничего общего с местоположением объекта. Это также виртуальный метод, поэтому каждый тип может определить его по мере необходимости.   -  person John Saunders    schedule 03.08.2010


Ответы (1)


Сборщик мусора присваивает каждому объекту уникальный идентификатор, и именно его реализация GetHashCode по умолчанию использует вместо расположения в памяти.

Редактировать На самом деле это немного сложнее. Не хочу никого вводить в заблуждение, поэтому вы, ребята, должны предпочесть Ответ Джона Скита по теме.

person zneak    schedule 03.08.2010
comment
+1 как за правильный ответ, так и за вашу ссылку :) - person SqlRyan; 03.08.2010
comment
Я не думаю, что в этой ссылке есть верная информация, по крайней мере, не в последней версии .NET. Когда я вызываю блокировку для объекта, я вижу увеличение использования его памяти в соответствии с созданием блока синхронизации. Но я не вижу увеличения использования памяти при вызове GetHashCode, поэтому я не думаю, что он создает блок синхронизации. - person fish; 03.08.2010
comment
@fish: на мой взгляд, это не очень научный способ проверить это. Откуда вы знаете, что увеличение памяти связано с блоком синхронизации, а не с чем-то еще, что .NET создает при использовании Monitor.Enter? - person zneak; 03.08.2010
comment
@fish: в .net 2.0 значение слова блока синхронизации было изменено, поэтому оно может содержать либо индекс блока синхронизации, либо неизменяемый идентификатор объекта, используемый GetHashCode (есть бит, который определяет, что представлено). Если слово блока синхронизации содержит индекс блока синхронизации, то слово внутри блока синхронизации будет содержать вышеупомянутый идентификатор объекта. - person supercat; 22.01.2013