Где находится реализация InternalEquals (объект objA, объект objB)

Разбирая исходный код .Net с помощью Reflector, я натолкнулся на реализацию Equals в классе объектов, и это относится к

bool InternalEquals(object objA, object objB);

Который снова относится к

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

Я теперь смущен относительно того, где найти реализацию этогоInternalEquals(object objA, object objB) функция и как она использует эту функцию и в какой сборке .Net эта функция определена, а также, если все и все написано с нуля для исходного кода .Net, то почему я не могу найти реализацию этой функции.

Ответы на вопрос(2)

[MethodImpl(MethodImplOptions.InternalCall)], Это означает, что он реализован в самой CLR как нативная процедура, а не сборка .NET.

Вы можете просмотреть аналогичный исходный код CLR, посмотрев наMicrosoft SSCLI (он же Ротор).

В 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
 Mehrdad Afshari21 дек. 2008 г., 11:56
Спасибо, Поддельный Джим, я обновил ответ, чтобы включить вашу ссылку.
 Fake Jim21 дек. 2008 г., 11:43
Ссылка на SSCLI:microsoft.com/downloads/...

кции ("InternalEquals" -> ObjectNative :: Equals):

FCFuncStart(gObjectFuncs)
    FCIntrinsic("GetType", ObjectNative::GetClass, CORINFO_INTRINSIC_Object_GetType)
    FCFuncElement("InternalGetHashCode", ObjectNative::GetHashCode)
    FCFuncElement("InternalEquals", ObjectNative::Equals)
    FCFuncElement("MemberwiseClone", ObjectNative::Clone)
FCFuncEnd()

Затем найдите реализацию ObjectNative :: Equals (опубликовано Mehrdad Afshari)

Ваш ответ на вопрос