例如,在我的编码中我使用VB函数
Round(1.325, 2)
Run Code Online (Sandbox Code Playgroud)
产生的数字为1.33.我想知道是否有一个地方可以查看"Round"函数背后的代码,这样我就可以生成自己的代码.
问题的原因:
我最近在一次采访中被要求生成一个不使用.net库中的.Reverse函数的反向函数.我钉了它,但还有其他基本功能需要学习,例如将数字格式化为设定的小数位数.能够查看.net库函数背后的代码可以帮助我实现这一目标.
TIA - 提前谢谢.
詹姆士
对于使用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)
正如评论中提到的,您可以在https://referencesource.microsoft.com/下载并浏览 .NET Framework 的源代码。
请注意,某些托管方法只是本机方法的包装器。您可以在 GitHub 上找到其中一些属于 .NET Core 一部分的实现: https: //github.com/dotnet/coreclr/tree/32f0f9721afb584b4a14d69135bea7ddc129f755