GetHashCode()的默认实现是如何工作的?它是否足够有效地处理 struct 、类、数组等?

我正在努力决定在什么情况下我应该打包自己的,在什么情况下我可以安全地依赖默认实现来做得很好.如果可能的话,我不想重新发明轮子.

推荐答案

namespace System {
    public class Object {
        [MethodImpl(MethodImplOptions.InternalCall)]
        internal static extern int InternalGetHashCode(object obj);

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

InternalGetHashCode映射到CLR中的ObjectNative::GetHashCode函数,如下所示:

FCIMPL1(INT32, ObjectNative::GetHashCode, Object* obj) {  
    CONTRACTL  
    {  
        THROWS;  
        DISABLED(GC_NOTRIGGER);  
        INJECT_FAULT(FCThrow(kOutOfMemoryException););  
        MODE_COOPERATIVE;  
        SO_TOLERANT;  
    }  
    CONTRACTL_END;  

    VALIDATEOBJECTREF(obj);  

    DWORD idx = 0;  

    if (obj == 0)  
        return 0;  

    OBJECTREF objRef(obj);  

    HELPER_METHOD_FRAME_BEGIN_RET_1(objRef);        // Set up a frame  

    idx = GetHashCodeEx(OBJECTREFToObject(objRef));  

    HELPER_METHOD_FRAME_END();  

    return idx;  
}  
FCIMPLEND

GetHashCodeEx的完整实现相当大,因此只需链接到the C++ source code就更容易了.

.net相关问答推荐

在`MAUI`应用中使用Android`MediaPlayer`的`prepare`方法只在发布模式下和在物理设备上崩溃

使用 Powershell TOM 在 SSAS 表格中创建分区

FileHelpers 未使用正确的日期格式

在 Rx 中,处理线程安全是否是消费者(IObserver)的责任?

更改列表中的值

使用 MassTransit、.NET Core 和 RabbitMQ 的设计挑战

将客户端证书添加到 .NET Core HttpClient

泛型方法是如何、何时、何地具体化的?

.Net 中的 Int128?

获取当前方法的名称

如何结合 ||条件语句中的运算符

如何授予所有用户对我的应用程序创建的文件的完全权限?

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

将日期时间转换为时间跨度

如何从 WCF REST 方法返回自定义 HTTP 状态代码?

判断任意字符串是否为有效文件名的最简单方法

程序员应该使用 SSIS,如果是,为什么?

在 WPF 中设置 Tab 键顺序

从 Visual Studio 2015 发布 - 允许不受信任的证书

连接字符串而不是使用一堆 TextBlocks