2011-06-17 10 views
10

Si creo un delegado en mi código como:¿Cómo funciona delegate.Invoke?

delegate void dostuff (string o); 

Esto genera una clase que deriva de System.MulticastDelegate que implementa tres métodos - Invoke, BeginInvoke y EndInvoke.

Si miro la IL compilado para Invoke todo lo que veo es:

.method public hidebysig newslot virtual 
     instance void Invoke(string o) runtime managed 
{ 
} // end of method dostuff::Invoke 

El método no contiene ningún código. Llamarlo funciona: el delegado es invocado, pero no puedo ver cómo lo hace.

¿De dónde viene el vudú que hace que llamar a Invoke realmente llame al delegado?

+0

Es solo parte del framework .Net subyacente: la llamada * es * la llamada a invocar. 'MyDelegate.Invoke()' es lo mismo que 'MyDelegate()' –

+0

MyDelegate() es simplemente azúcar sintáctica que se compila en MyDelegate.Invoke() - una llamada al método Invoke generado. El IL para la llamada es simplemente * callvirt instance void ConsoleApplication1.Program/dostuff :: Invoke (string) * que no es diferente de cualquier otra llamada a método. –

Respuesta

7

El vudú se puede encontrar al final de la firma: runtime managed. Tenga en cuenta que todas las clases y métodos administrados que defina estarán decorados como cli managed.

runtime managed significa que el tiempo de ejecución proporciona implementaciones pre-optimizadas de los métodos.

+0

El delegado tiene un comportamiento. Pasa por encima de su lista de invocación (un delegado puede representar varios métodos para llamar) y llama a cada método por turno. –

+0

No veo cómo el método de implementación puede anular el comportamiento. Es un patrón interesante, pero no puedo ver ninguna evidencia de que así sea. Sin embargo, no funcionaría para los delegados de multidifusión. Al crear el delegado, es definitivamente la clase delegada generada la que se crea y su constructor se llama con el método que se le pasa. No hay vudú aquí, solo está creando la clase de delegado generada al igual que cualquier clase normal que se cree. –

+0

@Mongus, actualicé mi respuesta. Sin embargo, tenga en cuenta que el "comportamiento" para iterar sobre la lista de invocación no es parte de un delegado, sino que forma parte de System.Delegate. –