Dot-Net
MethodImplOptions.InternalCall 的意義何在?
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存在?
我認為一個重要的原因是創建一個新的 IL 指令非常困難,它可能會影響很多工具,包括外部工具(
ILGenerator、ilasm、ildasm、PEVerify、Reflector、PostSharp,…)。但是創建一個新
InternalCall方法?這幾乎就像在 C# 中編寫方法一樣簡單(我假設,我沒有查看 Rotor 來驗證)並且它不會影響任何東西。這不僅僅是關於創建它,我認為這同樣適用於維護。