Muchos métodos en el BCL están marcados con el atributo [MethodImpl(MethodImplOptions.InternalCall)]
. Esto indicates que el "método se implementa dentro del tiempo de ejecución de lenguaje común".¿Cuál es el punto de MethodImplOptions.InternalCall?
¿Cuál era el sentido de diseñar el marco de esta manera sobre tener instrucciones CIL explícitas especificadas que el tiempo de ejecución estaría forzado a implementar? En última instancia, el atributo crea obligaciones contractuales para el tiempo de ejecución, pero de una manera que me parece confusa y no inmediatamente obvia.
Por ejemplo, Math.Pow
podría haber sido escrita esta manera (excusa mi mezcla informal de C# + IL y el propio si es malo IL; esto es sólo una muestra de explicar mi punto):
public static double Pow(double x, double y)
{
ldarg.0
ldarg.1
pow // Dedicated CIL instruction
ret
}
en lugar de la forma actual:
[MethodImpl(MethodImplOptions.InternalCall)]
public static double Pow(double x, double y);
¿Por qué existe MethodImplOptions.InternalCall
?
No es que eso no funcione, simplemente aumenta horriblemente. Las transacciones de la pila están implícitas para los códigos de operación IL, muchas herramientas tendrían que actualizarse para tratar con las firmas de función. Es gratis cuando la declaración está en los metadatos. Y fácilmente extensible más allá del estándar Ecma-335. –
@Hans: ¿se trataba de agregar compatibilidad con las nuevas instrucciones de IL? Entendí que Ani quería saber por qué los métodos 'InternalCall' estaban ahí en primer lugar. Solo preguntando ... –
@thecoon - '// Instrucción CIL dedicada' es una buena pista. –