默认实现Object.GetHash code() [英] Default implementation for Object.GetHashCode()
问题描述
如何为 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屋!