1. ホーム
  2. .net

[解決済み] Object.GetHashCode() のデフォルトの実装です。

2022-04-21 01:25:32

質問

のデフォルトの実装はどうなっているのでしょうか? GetHashCode() は動作しますか?また、構造体、クラス、配列などを効率よく、十分にうまく扱えるでしょうか?

私は、どのような場合に自分でパックするべきか、どのような場合にデフォルトの実装に頼って安全にうまくやるかを決めようとしています。可能であれば、車輪の再発明はしたくないのです。

どのように解決する?

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

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

InternalGetHashCode がマッピングされます。 ObjectNative::GetHashCode という関数がCLRにありますが、これは次のようなものです。

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++のソースコード .