Я читаю Эффективный С#, и есть комментарий о Object.GetHashCode()
, который я не сделал понимать:
Object.GetHashCode()
использует внутреннее поле в классеSystem.Object
для генерации хэш-значения. Каждому создаваемому объекту присваивается уникальный ключ объекта, который хранится как целое, когда он создается.
Эти ключи начинаются с 1 и увеличиваются каждый раз, когда новый объект любого типа получает создано. Поле идентификации объекта устанавливается в конструктореSystem.Object
и не может быть изменено позже.Object.GetHashCode()
возвращает это значение как хэш-код для данного объекта.
Я попытался посмотреть документацию Object.GetHashCode()
и не нашел никакой информации об этом.
Я написал простой кусок кода для печати хеш-кода вновь созданных объектов:
using System;
namespace TestGetHashCode
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
object o = new object();
Console.WriteLine(o.GetHashCode());
}
}
}
}
Первые несколько напечатанных номеров:
37121646,
45592480,
57352375,
2637164,
41014879,
3888474,
25209742,
26966483,
31884011
Что не похоже на то, что
Эти ключи начинаются с 1 и увеличиваются каждый раз, когда создается новый объект любого типа...
Object.GetHashCode()
возвращает это значение
Затем, чтобы найти это "внутреннее поле в System.Object
", я попытался использовать ReSharper декомпилированные источники, но код, который я нашел был
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
[__DynamicallyInvokable]
public virtual int GetHashCode()
{
return RuntimeHelpers.GetHashCode(this);
}
и снова используя декомпилированные источники, я обнаружил, что RuntimeHelpers.GetHashCode
был реализован как
[SecuritySafeCritical]
[__DynamicallyInvokable]
[MethodImpl(MethodImplOptions.InternalCall)]
public static int GetHashCode(object o);
после атрибута MethodImpl кажется, что я не могу просмотреть реализацию, и для меня это тупик.
Может кто-нибудь объяснить комментарий автора (первая цитата)?
Что такое внутреннее поле в классе Object и как оно используется для реализации Object.GetHashCode()
?