出于好奇,我想看看该Object.Equals()方法是如何实现的。
因此,我浏览了Object 的源代码,最终找到了RuntimeHelpers.Equals()。但是 RuntimeHelpers 的 Equals 方法是在外部实现的,没有 Dllimport 属性。
我在哪里可以找到 的“外部”实现RuntimeHelpers.Equals()?
您会发现它是在运行时本身中实现的。寻找这些外部方法的实现时,一个很好的切入点是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)
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |