例如,在我的编码中我使用VB函数
Round(1.325, 2)
产生数字1.33。我想知道是否有地方可以查看“Round”功能背后的代码,以便我可以自己制作。
问题的原因:
我最近在一次采访中被要求生成一个不使用.net库中的.Reverse函数的反向函数。我钉了它,但还有其他基本功能需要学习,例如将数字格式化为设定的小数位数。能够查看.net库函数背后的代码可以帮助我实现这一目标。
TIA - 提前致谢。
詹姆斯
答案 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