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

Jam*_*ham 6 c# vb.net asp.net

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

Round(1.325, 2)
Run Code Online (Sandbox Code Playgroud)

产生的数字为1.33.我想知道是否有一个地方可以查看"Round"函数背后的代码,这样我就可以生成自己的代码.

问题的原因:

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

TIA - 提前谢谢.

詹姆士

Mit*_*tch 5

对于使用C#实现的.Net Framework部分,最简单的方法是使用http://referencesource.microsoft.com/查看它们.对于其余部分,您需要下载SSCLI的副本或浏览 GitHub上的coreclr存储库.

有一本免费的电子书出版,试图解释大部分SSCLI2的内部工作原理,这是一个精简版的.Net 2.

InternalCall由运行时使用coreclr 中的文件ecalllist.h定义映射或sscli 中的映射来处理ecall.cpp.例如,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
Run Code Online (Sandbox Code Playgroud)

如果我们再看一下COMDouble我们可以找到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
Run Code Online (Sandbox Code Playgroud)


mm8*_*mm8 2

正如评论中提到的,您可以在https://referencesource.microsoft.com/下载并浏览 .NET Framework 的源代码。

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