默认实现Object.GetHash code() [英] Default implementation for Object.GetHashCode()

查看:224
本文介绍了默认实现Object.GetHash code()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何为 GetHash code,其默认的实现()工作?而且它处理结构,类,阵列等高效不够好?

我想,以决定在什么情况下,我要收拾我自己在什么情况下我可以放心地依赖于默认的实现做好。我不想重新发明轮子,如果在所有可能的。

解决方案

 命名空间系统{
    公共类对象{
        [MethodImpl(MethodImplOptions.InternalCall)
        内部静态外部INT InternalGetHash code(obj对象);

        公共虚拟INT GetHash code(){
            返回InternalGetHash code(本);
        }
    }
}
 

InternalGetHash code 映射到 ObjectNative :: GetHash code 功能的CLR,这看起来是这样的:

  FCIMPL1(INT32,ObjectNative :: GetHash code,对象* OBJ){
    CONTRACTL
    {
        抛出;
        禁用(GC_NOTRIGGER);
        INJECT_FAULT(FCThrow(kOutOfMemoryException));
        MODE_COOPERATIVE;
        SO_TOLERANT;
    }
    CONTRACTL_END;

    VALIDATEOBJECTREF(OBJ);

    DWORD IDX = 0;

    如果(OBJ == 0)
        返回0;

    OBJECTREF坷Ref(OBJ);

    HELPER_METHOD_FRAME_BEGIN_RET_1(坷Ref); //设置一个框架

    IDX = GetHash codeEX(OBJECTREFToObject(坷Ref));

    HELPER_METHOD_FRAME_END();

    返回IDX;
}
FCIMPLEND
 

全面实施 GetHash codeEX 是相当大的,所以它更容易只是链接到的 C ++源$ C ​​$ C

How does the default implementation for GetHashCode() work? And does it handle structures, classes, arrays, etc. efficiently and well enough?

I am trying to decide in what cases I should pack my own and in what cases I can safely rely on the default implementation to do well. I don't want to reinvent the wheel, if at all possible.

解决方案

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

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

InternalGetHashCode is mapped to an ObjectNative::GetHashCode function in the CLR, which looks like this:

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

The full implementation of GetHashCodeEx is fairly large, so it's easier to just link to the C++ source code.

这篇关于默认实现Object.GetHash code()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆