BCL 中的许多方法都标有该 [MethodImpl(MethodImplOptions.InternalCall)]
属性。这表明“方法是在公共语言运行时本身内实现的”。
以这种方式设计框架而不是指定运行时将被迫实现的显式 CIL 指令有什么意义?最终,该属性为运行时创建了合同义务,但在我看来,这种方式令人困惑,而且不是立即显而易见的。
例如,Math.Pow
可以这样写(如果我的 C# + IL 和 IL 本身不好,请原谅我的非正式混合;这只是解释我的观点的一个示例):
public static double Pow(double x, double y)
{
ldarg.0
ldarg.1
pow // Dedicated CIL instruction
ret
}
而不是当前的方式:
[MethodImpl(MethodImplOptions.InternalCall)]
public static double Pow(double x, double y);
为什么MethodImplOptions.InternalCall
存在?