在使用 Reflector 反汇编 .Net 源代码时,我发现了对象类中的 Equals 实现,它指的是
bool InternalEquals(object objA, object objB);
这又是指
internal static extern bool InternalEquals(object objA, object objB);
我现在很困惑在哪里可以找到这个 InternalEquals(object objA, object objB)
函数的实现,它是如何使用这个函数的,这个函数是在哪个 .Net 程序集中定义的,还有如果所有内容都是为 .Net 源代码从头开始编写的,那么为什么我找不到该函数的实现。
最佳答案
它被声明为 [MethodImpl(MethodImplOptions.InternalCall)]
。这意味着它是在 CLR 本身中实现的,作为 native 过程,而不是 .NET 程序集。
您可以通过查看 Microsoft SSCLI (aka Rotor) 查看类似的 CLR 源代码.
在 SSCLI 2.0 中,它被实现为(在 sscli20/clr/src/vm/comobject.cpp
中):
FCIMPL2(FC_BOOL_RET, ObjectNative::Equals, Object *pThisRef, Object *pCompareRef)
{
CONTRACTL
{
THROWS;
DISABLED(GC_NOTRIGGER);
INJECT_FAULT(FCThrow(kOutOfMemoryException););
MODE_COOPERATIVE;
SO_TOLERANT;
}
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->IsValueClass())
FC_RETURN_BOOL(FALSE);
// Make sure they are the same type.
if (pThisMT != pCompareRef->GetMethodTable())
FC_RETURN_BOOL(FALSE);
// Compare the contents (size - vtable - sink block index).
BOOL ret = memcmp(
(void *) (pThisRef+1),
(void *) (pCompareRef+1),
pThisRef->GetMethodTable()->GetBaseSize() - sizeof(Object) - sizeof(int)) == 0;
FC_GC_POLL_RET();
FC_RETURN_BOOL(ret);
}
FCIMPLEND
关于c# - InternalEquals(object objA, object objB) 的实现在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384294/