我正在阅读 Effective C#,其中有一条关于 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 类中的 internal 字段是什么,它如何用于实现 Object.GetHashCode()
?
GetHashCode()
必须返回一个唯一标识符?它被称为Get*Hash*Code()
而不是Get*UniqueIdentifier*()
,目的是什么。 - zerkmsreturn 42;
,一切都会正常工作(虽然不够高效,但不会出错)。 - zerkms