例如,在我的编码中我使用了 VB 函数
Round(1.325, 2)
产生数字 1.33。我想知道是否有地方可以查看“Round”函数背后的代码,以便我可以生成自己的代码。
问题原因:
我最近在一次采访中被要求生成一个不使用 .net 库中的 .Reverse 函数的反向函数。我成功了,但还有其他基本功能需要学习,例如将数字格式化为一定数量的小数位。能够查看 .net 库函数背后的代码将有助于我实现这一目标。
TIA - 提前致谢。
詹姆斯
最佳答案
对于用 C# 实现的 .Net Framework 部分,最容易使用 http://referencesource.microsoft.com/ 查看它们.对于其余部分,您需要下载 SSCLI 的副本或 browse the coreclr repository在 GitHub 上。
有一个free eBook published它试图解释大部分 SSCLI2 的内部工作原理,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
关于c# - 在哪里可以查看 .net 库背后的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41347934/