GetHashCode()
的默认实现是如何工作的?它是否足够有效地处理 struct 、类、数组等?
我正在努力决定在什么情况下我应该打包自己的,在什么情况下我可以安全地依赖默认实现来做得很好.如果可能的话,我不想重新发明轮子.
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就更容易了.