【发布时间】:2023-03-04 08:12:05
【问题描述】:
BCL 中的许多方法都标有[MethodImpl(MethodImplOptions.InternalCall)] 属性。
这个indicates 表示“方法在公共语言运行时本身内实现”。
以这种方式设计框架而不是指定显式 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 存在?
【问题讨论】:
-
这不是不能工作,它只是可怕地扩展。堆栈事务对于 IL 操作码是隐式的,必须更新许多工具来处理函数签名。当声明在元数据中时,它是免费的。并且可以轻松扩展超出 Ecma-335 标准。
-
@Hans:关于现在添加对新 IL 指令的支持的问题是什么?我知道 Ani 想知道为什么
InternalCall方法首先存在。只是问... -
@thecoon -
// Dedicated CIL instruction是一个很好的提示。 -
@Hans:清除。没想到会不会,因为在最初的设计之后的 10 多年里,他们现在似乎不太可能改变事情。
标签: .net clr cil framework-design