当前位置:  开发笔记 > 编程语言 > 正文

InternalEquals的实现在哪里(object objA,object objB)

如何解决《InternalEquals的实现在哪里(objectobjA,objectobjB)》经验,为你挑选了1个好方法。

在使用Reflector反汇编.Net源代码时,我在Object Class中实现了Equals实现,它引用了

bool InternalEquals(object objA, object objB);

这也是指

internal static extern bool InternalEquals(object objA, object objB);

我现在很困惑在哪里找到这个InternalEquals(object objA, object objB)函数的实现,以及它是如何使用这个函数的,并且.Net程序集是这个函数定义的,如果每个和所有内容都是从头开始编写.Net源代码,那么为什么是我无法找到此功能的实现.



1> Mehrdad Afsh..:

它被宣布为[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

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有