Gun*_*ini 5 .net c# class-library equals
在使用Reflector反汇编.Net源代码时,我在Object Class中实现了Equals实现,它引用了
bool InternalEquals(object objA, object objB);
Run Code Online (Sandbox Code Playgroud)
这也是指
internal static extern bool InternalEquals(object objA, object objB);
Run Code Online (Sandbox Code Playgroud)
我现在很困惑在哪里找到这个InternalEquals(object objA, object objB)函数的实现,以及它是如何使用这个函数的,并且.Net程序集是这个函数定义的,如果每个和所有内容都是从头开始编写.Net源代码,那么为什么是我无法找到此功能的实现.
Meh*_*ari 12
它被宣布为[MethodImpl(MethodImplOptions.InternalCall)].这意味着它在CLR本身中实现,作为本机过程,而不是.NET程序集.
您可以通过查看Microsoft SSCLI(aka Rotor)查看类似的CLR源代码.
在SSCLI 2.0中,它实现为(in 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1138 次 |
| 最近记录: |