gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:21:12 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com