2011-09-03 6 views
19

¿Cómo puede existir la función global en C# cuando todo está definido dentro de una clase? Estaba leyendo la documentación de OpCodes.Call en MSDN, y se sorprendió al ver las siguientes menciones,¿Cómo puede existir la función global en C#?

El token de metadatos contiene información suficiente para determinar si la llamada es a un método estático, un método de instancia, un método virtual, o una función global.

¿Función global? ¿Existe en C#? (Definitivamente no se refiere al método static, ya que está listado explícitamente junto con la función global).

+3

OpCodes.Call no es específico de C#, sino para el CLR –

+0

Si le dijimos que tendríamos que kil Tú. ;) En serio, los globales son malos, no busques implementarlos. – TrueWill

+0

¿Por qué son malas funciones/métodos globales por definición? –

Respuesta

15

No puede tener funciones globales en C#, simplemente no es parte del idioma. Debe usar un método estático en la clase que elija para obtener una funcionalidad similar.

Sin embargo, C# no es el único lenguaje que utiliza el CLR. Uno puede escribir Managed C++, que puede tener funciones globales.

+1

Pero he escuchado y leído en alguna parte que cuando escribe Managed C++ (o C++/CLI), todas las funciones globales se insertan en una clase estática, generada por el compilador. En efecto, no hay noción de funciones globales. – Nawaz

+0

Eso puede suceder bajo las sábanas, no estoy seguro. Si encuentras el enlace, publícalo. Todavía hay otros idiomas ... No he realizado una encuesta completa. –

+7

@Nawaz: Es un detalle de implementación que no está relacionado con esta discusión. El punto sobresaliente de ese punto es que 'System.Reflection.Emit' pertenece a IL, no a C# o Managed C++ o cualquier otro lenguaje que se compile en IL y se asienta sobre .NET Framework. No importa si hay o no funciones globales en Managed C++, o cómo se implementan. Lo que importa es que en las máquinas virtuales o reales que interpretan IL, existe una noción de funciones globales y 'System.Reflection.Emit.OpCodes.Call' se puede usar para emitir un código de operación IL que pueda invocar una función global. – jason

3

Supongo que la cosa es que esta es la operación de inyección IL, pero IL es no absolutamente solo sobre C#. En otras palabras, es para el soporte del lenguaje que admite funciones globales.

+0

Por ejemplo? ... – Nawaz

+1

@Nawaz: Creo que esto se trata de idiomas dinámicos como, por ejemplo IronPython, F # (no muy seguro).Aquí se puede encontrar algo interesante sobre la generación dinámica de métodos: http://msdn.microsoft.com/en-us/library/system.reflection.emit.modulebuilder.createglobalfunctions(VS.95).aspx – Tigran

3

La documentación a la que se refiere es para .net. C# no tiene funciones globales, pero .net sí.

+1

¿Cómo exactamente? Por favor sea más generoso en su respuesta. :-) (Soy nuevo en .Net). – Nawaz

+2

.net es una plataforma. El compilador C# existe sobre esa plataforma, pero .net fue diseñado para servir más de C#. Los diseñadores de C# eligieron no tener en cuenta las funciones globales en el diseño de ese idioma, pero otros lenguajes creados en .net podrían elegir hacerlo. De hecho, .net está lleno de características que no están expuestas a través de idiomas individuales. –

7

Porque System.Reflection.Emit.OpCodes.Call no es sobre C#. Se trata de emitir códigos de operación IL. En IL, hay características que no están disponibles en C#. Funciones globales es una de esas características.

3

C# no es compatible con todas las características de MSIL. Funciones globales es uno de ellos. VB.Net, F #, IronPython u otro lenguaje similar para usar esta y otras características que no son generadas por el compilador de C#.

+0

Ellos podrían, quizás no. No importa. El punto clave es que IL los admite y, por lo tanto, las máquinas virtuales o reales que interpretan IL son compatibles. No importa si otros lenguajes compilados en IL lo hacen, o si los compiladores de esos idiomas traducen esas funciones globales en funciones globales en el IL compilado. – jason

3

Sólo estoy sobrescribir mi respuesta anterior ...

Esto es lo que cada uno verá como en IL DASM con sus códigos asociados:

// Static Method 
IL_0001: call  void testapp.Form1::Test() 

// Instance Method 
IL_0001: call  instance void testapp.Form1::Test() 

// Virtual Method 
IL_0001: callvirt instance void testapp.Form1::Test() 

// Global Function 
IL_0000: call  void testapp.Test() 

Así que para responder a su pregunta, no hay una forma directa de generar el token de metadatos en el último método para C#. Tuve que crear el último en C++.

11

En la conferencia Build 2014 se anunció que a partir de Roslyn en adelante, puede importar los métodos estáticos de tipos por la directiva using TypeName;, por lo que en lugar de tener que utilizar System.Math.Min(...) que puede hacer:

using System.Math; 
... 
var z = Min(x,y); 

Nota: en el momento de la liberación de esto se convirtió en:

using static System.Math; 
+0

+1. Buena información – Nawaz

+0

Aunque en el sentido de la pregunta original, esta todavía no es una función global; es una taquigrafía sintáctica que te ahorra tipear "System.Math.Min" o "Math.Min". En cuanto al tiempo de ejecución, sigue siendo solo una función estática en la clase "System.Math" – jimmyfever

Cuestiones relacionadas