我在哪里可以查看.net库背后的代码?

时间:2016-12-27 15:33:17

标签: c# asp.net vb.net

例如,在我的编码中我使用VB函数

Round(1.325, 2)

产生数字1.33。我想知道是否有地方可以查看“Round”功能背后的代码,以便我可以自己制作。

问题的原因:

我最近在一次采访中被要求生成一个不使用.net库中的.Reverse函数的反向函数。我钉了它,但还有其他基本功能需要学习,例如将数字格式化为设定的小数位数。能够查看.net库函数背后的代码可以帮助我实现这一目标。

TIA - 提前致谢。

詹姆斯

2 个答案:

答案 0 :(得分:5)

对于在C#中实现的.Net Framework部分,最简单的方法是使用http://referencesource.microsoft.com/查看它们。对于其他人,您需要在GitHub上下载SSCLI或browse the coreclr repository的副本。

有一个free eBook published试图解释大部分SSCLI2的内部运作,这是.Net 2的精简版。

InternalCall由运行时使用定义的in the file ecalllist.h in coreclr映射处理,或者在ecall.cpp中为sscli处理。例如,Math.Round映射为:

// 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

如果我们查看课程COMDouble,我们可以find in comfloat.cpp执行,我们会看到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

答案 1 :(得分:2)

如评论中所述,您可以在https://referencesource.microsoft.com/下载和浏览.NET Framework的源代码。

请注意,某些托管方法只是本机方法的包装器。您可以在GitHub上找到其中一些属于.NET Core的实现:https://github.com/dotnet/coreclr/tree/32f0f9721afb584b4a14d69135bea7ddc129f755