tipo - programacion de eventos c#
En.NET, ¿cuál es la implementación interna de un delegado? (2)
Internamente es un tipo de referencia, bastante similar a una clase. Transcrito se ve así:
public /* delegate */ class PerformCalculation : MulticastDelegate {
public PerformCalculation(object target, IntPtr method) {}
public virtual void Invoke(int x, int y) {}
public virtual IAsyncResult BeginInvoke(int x, int y, AsyncCallback callback, object state) {}
public virtual void EndInvoke(IAsyncResult result) {}
}
Dejé vacías las implementaciones de estos miembros, en realidad se asignan al código en el CLR. El compilador genera dinámicamente las firmas del método, dependiendo de la firma de la declaración delegada. Tenga en cuenta los argumentos x y y. El compilador JIT ayuda a obtener el nombre del constructor, utilizando la sintaxis + = o - =, conoce la dirección de memoria del método de destino de delegado. El compilador generó automáticamente el valor del argumento de destino , dependiendo de si el método de destino era estático o no. Los dos argumentos se asignan a las propiedades Delegate.Target y Method (Multicast). La instancia de la clase base real puede ser Delegado o MulticastDelegate, dependiendo de cuántos destinos se hayan suscrito.
Aquí hay mucha salsa secreta.
Entiendo que una declaración de un delegado es algo como esto:
public delegate int PerformCalculation(int x, int y);
Sin embargo, debe haber más cosas. El propósito del delegado es proporcionar un puntero a un método y, para ello, encapsular la referencia al método en el delegado.
¿En qué tipo de estructura se encuentra esta referencia (internamente en el delegado)? También entiendo que puede encapsular una referencia a múltiples métodos en un delegado. ¿Significa esto que hay una matriz en el delegado que tiene estos?
Además, qué métodos se definen en el delegado, etc. Lo que realmente sucede cuando declara un delegado con el resumen:
public delegate int PerformCalculation(int x, int y);
?
EDIT: Algunas aclaraciones. Cuando declara un delegado, el compilador crea automáticamente una clase sellada que hereda de System.MulticastDelegate por usted. Puede ver esto si observa su ensamblaje con ildasm. Esto limpio. Básicamente, con una declaración, obtienes una nueva clase completa generada para ti en tiempo de compilación, y tiene toda la funcionalidad que necesitas.
Todos los delegados heredan del tipo System.Delegate que contiene un Target y un Method . Más precisamente, heredan de System.MultiCastDelegate que hereda de System.Delegate
.