Реализация методов System.Object

147
08 марта 2019, 12:10

Задался вопросом, а где можно найти механизм методов System.Object? Ведь все время мы только используем или перегружаем эти методы, а где можно найти именно мехазм того же Equals()?

VS к сожалению через "Показать определение" дает только описание методов. Заранее спасибо.

Не вижу исходник пропустив библиотеку mscorlib.dll через ILdasm

Answer 1

Вы не увидите реализации Object.Equals в .NET коде. Вызов этого метода в .NET вызывает нативный код. Вы можете посмотреть исходник этого метода в исходниках clr: https://github.com/dotnet/coreclr/blob/master/src/classlibnative/bcltype/objectnative.cpp#L153

//
// Compare by ref for normal classes, by value for value types.
//  
// <TODO>@todo: it would be nice to customize this method based on the
// defining class rather than doing a runtime check whether it is
// a value type.</TODO>
//
FCIMPL2(FC_BOOL_RET, ObjectNative::Equals, Object *pThisRef, Object *pCompareRef)
{
    CONTRACTL
    {
        FCALL_CHECK;
        INJECT_FAULT(FCThrow(kOutOfMemoryException););
    }
    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->IsValueType())
        FC_RETURN_BOOL(FALSE);
    // Make sure they are the same type.
    if (pThisMT != pCompareRef->GetMethodTable())
        FC_RETURN_BOOL(FALSE);
    // Compare the contents (size - vtable - sync block index).
    DWORD dwBaseSize = pThisRef->GetMethodTable()->GetBaseSize();
    if(pThisRef->GetMethodTable() == g_pStringClass)
        dwBaseSize -= sizeof(WCHAR);
    BOOL ret = memcmp(
        (void *) (pThisRef+1), 
        (void *) (pCompareRef+1), 
        dwBaseSize - sizeof(Object) - sizeof(int)) == 0;
    FC_GC_POLL_RET();
    FC_RETURN_BOOL(ret);
}
FCIMPLEND
READ ALSO
Как в Linux добавить корневой сертификат для браузеров через Net.Core?

Как в Linux добавить корневой сертификат для браузеров через Net.Core?

Генерировал свой CA сертификатЕсли импортировать из браузера то все работает

165
Automapper. Маппинг внутри CreateMap

Automapper. Маппинг внутри CreateMap

У меня есть примерно такой код:

160
Unit тесты в файлах

Unit тесты в файлах

Есть программа, которая заменяет подстроку в файлеРаботает правильно, но такой юнит тест:

134
Удаление элементов по кругу

Удаление элементов по кругу

Есть задача: по кругу стоят от 1 до N человекИдя по кругу надо вычеркивать каждого второго, пока не останется один и, соответственно, вывести...

164