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

标签 c# .net equals class-library

在使用 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/

相关文章:

Mysql:intvalue ='1' 和 intvalue=1 之间的区别

c# - Nancy 应用程序的动态站点地图生成器

c# - BeginInvoke 未在 WPF 应用程序的线程内触发

c# - 在 Application_Start 上启动长时间运行的线程时的潜在陷阱

java - 检查 RDD 的相等性

java - 为什么 Long equals 在相同值时返回 false?

c# - C# Xml 序列化问题

c# - 使用 xdocument 按不区分大小写的属性搜索元素

c# - 找不到 CodeDom 提供程序类型 "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider ..."

c# - RichTextBox 粘贴限制为 32k 个字符?