我正在阅读有效的 C# https://rads.stackoverflow.com/amzn/click/com/0321658701并且有一条评论关于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 反编译源 http://blog.jetbrains.com/dotnet/2011/02/17/resharper-6-bundles-decompiler-free-standalone-tool-to-follow/但我找到的代码是
[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 属性 https://stackoverflow.com/questions/11161120/whats-the-point-of-methodimploptions-internalcall看来我无法查看实施情况,这对我来说是一个死胡同。
有人可以解释一下作者的评论(第一句话)吗?
Object 类中的内部字段是什么以及如何使用它来实现Object.GetHashCode()
?