【问题标题】:Where can I view the code behind the .net library?在哪里可以查看 .net 库背后的代码?
【发布时间】:2016-12-27 15:33:17
【问题描述】:

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

Round(1.325, 2)

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

问题原因:

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

TIA - 提前致谢。

詹姆斯

【问题讨论】:

  • 或获取反编译器。有很多免费的
  • 问题是Math.Round调用了参考源中没有的“内部”实现。
  • 还要记住,这些面试问题的重点不应该是得到“正确”的答案,而是看看你是如何解决问题的。因此,在没有说明您的思考过程的情况下(或者更糟糕的是没有解释它的工作原理为什么)反刍“正确”代码可能比思考问题并即时解决它们更糟糕。 99% 以上的软件开发都在编写代码,而不仅仅是重用现有代码。我并不是说你的目标不合适,只是为了争辩说你可能从错误的角度思考这些问题。
  • @DStanley,它不在参考源上,但它在 GitHub 上。 InternalCall 是mapped in ecalllist.h,Math.Round 在COMDouble::Round 中实现。

标签: c# asp.net vb.net


【解决方案1】:

对于用 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

【讨论】:

  • 谢谢@Mitch!你们摇滚!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2014-12-30
    • 2016-04-04
    • 2018-06-21
    • 1970-01-01
    • 2010-09-20
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多