Object.Equals()“最终”是如何实现的?

use*_*035 1 c# .net-core

出于好奇,我想看看该Object.Equals()方法是如何实现的。

因此,我浏览了Object 的源代码,最终找到了RuntimeHelpers.Equals()。但是 RuntimeHelpers 的 Equals 方法是在外部实现的,没有 Dllimport 属性。

我在哪里可以找到 的“外部”实现RuntimeHelpers.Equals()

can*_*on7 5

您会发现它是在运行时本身中实现的。寻找这些外部方法的实现时,一个很好的切入点是ecalllist.h。在这里我们发现:

FCFuncElement("Equals", ObjectNative::Equals)
Run Code Online (Sandbox Code Playgroud)

所以它是由 实现的ObjectNative::Equals,我们在 objectnative.cpp 中找到它:

FCIMPL2(FC_BOOL_RET, ObjectNative::Equals, Object *pThisRef, Object *pCompareRef)
{
    CONTRACTL
    {
        FCALL_CHECK;
        INJECT_FAULT(FCThrow(kOutOfMemoryException););
    }
    CONTRACTL_END;

    if (pThisRef == pCompareRef)
        FC_RETURN_BOOL(TRUE);

    // Since we are in FCALL, we must handle NULL specially.
    if (pThisRef == NULL || pCompareRef == NULL)
        FC_RETURN_BOOL(FALSE);

    MethodTable *pThisMT = pThisRef->GetMethodTable();

    // If it's not a value class, don't compare by value
    if (!pThisMT->IsValueType())
        FC_RETURN_BOOL(FALSE);

    // Make sure they are the same type.
    if (pThisMT != pCompareRef->GetMethodTable())
        FC_RETURN_BOOL(FALSE);

    // Compare the contents (size - vtable - sync block index).
    DWORD dwBaseSize = pThisMT->GetBaseSize();
    if(pThisMT == g_pStringClass)
        dwBaseSize -= sizeof(WCHAR);
    BOOL ret = memcmp(
        (void *) (pThisRef+1),
        (void *) (pCompareRef+1),
        dwBaseSize - sizeof(Object) - sizeof(int)) == 0;

    FC_GC_POLL_RET();

    FC_RETURN_BOOL(ret);
}
FCIMPLEND
Run Code Online (Sandbox Code Playgroud)