2016-12-27 12 views
5

Na przykład w moim kodowania I przy użyciu funkcji VBGdzie mogę wyświetlić kod za biblioteką .net?

Round(1.325, 2) 

która produkuje numer 1.33. Zastanawiam się, czy istnieje miejsce, w którym można zobaczyć kod za funkcją "Round", dzięki czemu mogę produkować własne.

Powód pytanie:

Byłem niedawno zapytany w wywiadzie produkować odwrotną funkcję, która nie korzysta z funkcji .Reverse z biblioteki .NET. Przybiłem to, ale są inne podstawowe funkcje do nauki, takie jak formatowanie liczby do określonej liczby miejsc dziesiętnych. Będąc w stanie spojrzeć na kod funkcji biblioteki .net pomoże mi w tym dążeniu.

TIA - Z góry dzięki.

James

+4

https: // referencesource .microsoft.com/ – Plutonix

+0

lub skorzystaj z dekompilatora. Jest wiele darmowych – Jonesopolis

+0

Istnieją również odpowiedniki NET dla wszystkich starszych funkcji VB, jeśli nie podoba ci się dokładnie, jak działają – Plutonix

Odpowiedz

5

Dla części .Net Framework, które są zaimplementowane w C#, najłatwiej je przejrzeć przy pomocy http://referencesource.microsoft.com/. Co do reszty, będziesz musiał pobrać kopię SSCLI lub browse the coreclr repository na GitHub.

Było free eBook published który próbuje wyjaśnić wewnętrzne funkcjonowanie większość SSCLI2, który jest odchudzona wersja .Net 2.

InternalCall jest obsługiwane przez program przy użyciu mapowania zdefiniowanego in the file ecalllist.h in coreclr lub w ecall.cpp dla sscli. Na przykład, Math.Round jest odwzorowany jako:

// snip 
FCFuncStart(gMathFuncs) 
    FCIntrinsic("Sin", COMDouble::Sin, CORINFO_INTRINSIC_Sin) 
    FCIntrinsic("Cos", COMDouble::Cos, CORINFO_INTRINSIC_Cos) 
    FCIntrinsic("Sqrt", COMDouble::Sqrt, CORINFO_INTRINSIC_Sqrt) 
    FCIntrinsic("Round", COMDouble::Round, CORINFO_INTRINSIC_Round) 
// snip 

Gdybyśmy wtedy patrzeć na klasę COMDouble, którego realizacja możemy find in comfloat.cpp widzimy kod za Math.Round:

/*====================================Round===================================== 
** 
==============================================================================*/ 
FCIMPL1_V(double, COMDouble::Round, double x) 
    FCALL_CONTRACT; 

    // If the number has no fractional part do nothing 
    // This shortcut is necessary to workaround precision loss in borderline cases on some platforms 
    if (x == (double)((INT64)x)) { 
     return x; 
    } 

    // We had a number that was equally close to 2 integers. 
    // We need to return the even one. 

    double tempVal = (x + 0.5); 
    double flrTempVal = floor(tempVal); 

    if ((flrTempVal == tempVal) && (fmod(tempVal, 2.0) != 0)) { 
     flrTempVal -= 1.0; 
    } 

    return _copysign(flrTempVal, x); 
FCIMPLEND 
+0

Dzięki @Mitch! Jesteście rocka! –

Powiązane problemy