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?
Es solo parte del framework .Net subyacente: la llamada * es * la llamada a invocar. 'MyDelegate.Invoke()' es lo mismo que 'MyDelegate()' –
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. –