我可以帮你翻译成中文:我在哪里能查看 .net 库的代码?

6
例如,在我的编码中,我使用VB函数。
Round(1.325, 2)

产生数字1.33。我想知道是否有地方可以查看“Round”函数背后的代码,以便我可以创造自己的函数。
问题的原因:
最近在面试中被要求制作一个不使用.net库中的.Reverse函数的反向函数。我成功了,但还有其他基本的函数需要学习,例如将数字格式化为一定的小数位数。能够查看.net库函数背后的代码将有助于我追求这个目标。
TIA-提前感谢。
詹姆斯

5
https://referencesource.microsoft.com/ - Ňɏssa Pøngjǣrdenlarp
或者使用反编译器。有很多免费的选择。 - Jonesopolis
5
问题在于 Math.Round 调用了不在参考源代码中的“内部”实现。 - D Stanley
2
还要记住,这些面试问题的重点不是得到“正确”的答案,而是看你如何解决问题。所以,只是机械地背诵“正确”的代码而没有展示你的思考过程(更糟糕的是没有解释为什么它有效),可能比较糟糕,因为99%以上的软件开发都是编写新代码,而不仅仅是重复使用已有的代码。我并不是说你的目标不合适,只是想说明你可能从一个错误的角度来考虑这些问题。 - D Stanley
4
@DStanley,它不在referencesource上,但是在GitHub上。 InternalCall被映射在ecalllist.h中(https://github.com/dotnet/coreclr/blob/master/src/vm/ecalllist.h#L1241),而Math.Round是在[`COMDouble :: Round`](https://github.com/dotnet/coreclr/blob/32f0f9721afb584b4a14d69135bea7ddc129f755/src/classlibnative/float/floatdouble.cpp#L201) 中实现的。 - Mitch
显示剩余2条评论
2个回答

5
对于使用C#实现的.Net Framework部分,最容易使用http://referencesource.microsoft.com/进行审查。 对于其他部分,您需要下载SSCLI的副本或在GitHub上浏览coreclr存储库
曾经出版了一本免费电子书,试图解释SSCLI2的许多内部工作原理,它是.Net 2的精简版本。 InternalCall由运行时使用在coreclr中定义的映射处理{{link4:文件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

如果我们查看类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

谢谢 @Mitch!你们真棒! - James Cunningham

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接