Задался вопросом, а где можно найти механизм методов System.Object? Ведь все время мы только используем или перегружаем эти методы, а где можно найти именно мехазм того же Equals()?
VS к сожалению через "Показать определение" дает только описание методов. Заранее спасибо.
Не вижу исходник пропустив библиотеку mscorlib.dll через ILdasm
Вы не увидите реализации 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Генерировал свой CA сертификатЕсли импортировать из браузера то все работает
Есть программа, которая заменяет подстроку в файлеРаботает правильно, но такой юнит тест:
Есть задача: по кругу стоят от 1 до N человекИдя по кругу надо вычеркивать каждого второго, пока не останется один и, соответственно, вывести...