RuntimeHelpers.GetHashCode是一个静态方法,用于获取对象的哈希码。该方法是在运行时辅助类(RuntimeHelpers)中定义的。它返回一个整数,该整数可以用作对象在哈希表中的键。哈希码是根据对象的内容计算的,通常用于快速查找和比较对象。

6 浏览
0 Comments

RuntimeHelpers.GetHashCode是一个静态方法,用于获取对象的哈希码。该方法是在运行时辅助类(RuntimeHelpers)中定义的。它返回一个整数,该整数可以用作对象在哈希表中的键。哈希码是根据对象的内容计算的,通常用于快速查找和比较对象。

RuntimeHelpers.GetHashCode(object) 方法允许根据对象的标识生成哈希码。MSDN 声明:\n

\nRuntimeHelpers.GetHashCode 方法总是非虚地调用 Object.GetHashCode 方法,即使对象的类型已经重写了 Object.GetHashCode 方法。\n

\n

[MethodImpl(MethodImplOptions.InternalCall)]
[SecuritySafeCritical]
public static extern int GetHashCode(object o);

\n然而,当使用 Reflector (.NET 4.0) 检查 Object.GetHashCode() 方法时,我们会看到以下代码:\n

public virtual int GetHashCode()
{
    return RuntimeHelpers.GetHashCode(this);
}

\n这使我相信 MSDN 的文档是错误的,因为在 RuntimeHelpers.GetHashCode(object) 中调用 Object.GetHashCode 会导致堆栈溢出。\n那么 RuntimeHelpers.GetHashCode(object) 的实际行为是什么?它是如何计算哈希值的?

0
0 Comments

在Reflector中查看System.Object.GetHashCode方法时,我们可以看到代码实现如下:

public virtual int GetHashCode()
{
    return InternalGetHashCode(this);
}

而对于RuntimeHelpers.GetHashCode方法,代码实现如下:

public static int GetHashCode(object o)
{
    return object.InternalGetHashCode(o);
}

这两段代码的实现方式有所不同,可能是因为使用的是不同的框架版本。我正在查看的是2.0版本的程序集。

这个问题的出现原因可能是因为在不同的框架版本中,对于GetHashCode方法的实现方式可能有所不同。尽管实现方式不同,但行为仍然是按规范执行的,因此不会影响代码的正确性。

解决方法是要根据具体的框架版本和需求来选择合适的实现方式。在2.0版本的程序集中,可以使用System.Object.GetHashCode方法来获取对象的哈希码。而在其它版本的程序集中,可能需要使用RuntimeHelpers.GetHashCode方法来获取对象的哈希码。

无论选择哪种方式,获取到的哈希码都可以用于对象的比较、集合的操作等场景中,以确保代码的正确性和性能。

0
0 Comments

RuntimeHelpers.GetHashCode是一个方法,用于获取对象的哈希码。然而,由于object.GetHashCode()方法可以被重写,所以无法获取默认实现返回的“身份哈希码”。为了解决这个问题,可以使用RuntimeHelpers.GetHashCode方法来获取对象的哈希码。

为了说明这个问题,下面给出了一个示例代码。在这个示例中,定义了一个IdentityComparer类,用于比较对象的身份。在该类的GetHashCode方法中,调用了RuntimeHelpers.GetHashCode方法来获取对象的哈希码。

示例代码中,首先创建了两个字符串x和y,它们的值相同但是引用不同。然后通过比较它们的哈希码和调用IdentityComparer类的Equals方法来判断它们是否相等。可以看到,通过调用RuntimeHelpers.GetHashCode方法获取的哈希码是相等的,而通过调用object.GetHashCode方法获取的哈希码是不相等的。

需要注意的是,RuntimeHelpers.GetHashCode方法会处理null值,所以不需要额外处理。

在讨论中还提到了一些关于RuntimeHelpers.GetHashCode方法的实现细节和一些语言特性的问题,但从用户的角度来看,这些并不重要。重要的是该方法的行为是正确的,并且能够正确地获取对象的哈希码。

RuntimeHelpers.GetHashCode方法的存在是为了解决object.GetHashCode方法被重写时无法获取“身份哈希码”的问题。通过调用该方法,可以获取到与非虚拟调用Object.GetHashCode方法相同的结果。

0
0 Comments

在这段讨论中,人们对于MSDN文档中对于`RuntimeHelpers.GetHashCode()`方法的描述进行了讨论。有人认为MSDN文档试图描述的是该方法的行为,而不是实现方式。关键点是,`RuntimeHelpers`返回的是在`object.GetHashCode()`没有被重写时所得到的默认实现。

这对于构建引用相等性查找非常有用,即使是对于已经重写了`Equals`和`GetHashCode`方法的类型。有人在自己维护的序列化程序中使用`RuntimeHelpers.GetHashCode()`和`Object.ReferenceEquals`来实现这一点。

所以,文档有些误导,或者我理解错了吗?

是的,说它"non-virtually调用了Object.GetHashCode方法"有些误导,特别是考虑到这里展示的其他两种实现方式(在你的帖子和Me.Name的帖子中)。

是的,但根据这篇帖子和一个答案中的两个反射器转储,它实际上并不是IL的实现方式。

是的,我将在我的答案中详细说明,而不是在评论中。

我期待着它的出现。

"你想要构建一个引用相等性查找"。猜猜看,这正是我正试图做的事情。

我猜这是一个拼写错误。应该是`RuntimeHelpers`而不是`RuntimeTypeHelpers`。

0