小编典典

Object.GetHashCode() 的默认实现

all

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

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


阅读 131

收藏
2022-07-31

共1个答案

小编典典

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 的完整实现相当大,因此更容易链接到C++
源代码

2022-07-31