Los delegados son objetos que encapsulan las referencias a las funciones. Uno de los usos comunes de la mayoría de los delegados es la implementación de controladores para eventos.
Para ver esto en acción, cree un nuevo proyecto Windows Forms (WinForms) y arraste un botón al formulario, a continuación, haga doble clic en el botón para crear el código que controlará el evento click, el diseñador de formularios Windows Forms creara dos piezas separadas de código.
private void button1 (object sender, System.EventArgs e)
(
MessageBox.Show ("Prueba");
)
Además, y por lo general oculta en la región de la forma de código generado por el diseñador, el código está conectado al evento de clic del botón:
this. Button1.Click + = System.EventHandler (this. Button1);
Tenga en cuenta que el método controlador de eventos tiene que ser conforme a una firma determinada (dos parámetros del tipo de object y System.EventArgs en este caso). Esta firma se define en el delegado System.EventHandler.
La gran pregunta es: ¿Qué ganamos con la creación de este método independiente que está ligado al evento de clic a través del delegado EventHandler? Bueno, no mucho, porque no hay una verdadera necesidad para llamar al método de otro modo. Pero todo esto es necesario para hacer el trabajo de gestión de eventos.
Métodos Anónimo simplifica esto un poco. En lugar de crear instancias de un delegado y la creación de un método, el código para el método de control podrá ser creado dentro de la misma línea de código.
this.button1.Click +=
delegate(object sender, EventArgs e)
{ MessageBox.Show("Prueba"); };
Como puede ver, lo que se asigna al evento Click no es un puntero a un método. Tenga en cuenta que tiene que haber un punto y coma al final, porque todo esto es realmente sólo una línea de código.
Uno de los usos geniales de esta técnica es la capacidad de pasar código como parámetro. Imagine un escenario en el que se utiliza un delegado como un call-back, un patrón que se utiliza habitualmente en una serie de escenarios, como la programación asincrónica, o cada vez que un proceso informe sobre sus avances. He aquí un ejemplo que ilustra esto:
public delegate void
Feedback(string Text);
public void Execute(Feedback d1)
{
d1("Iniciando...");
// Más código
d1("Inicializando aplicación...");
// Mucho Más código
d1("Inicialización terminada.");
}
Uno puede crear instancias de un delegado que encapsule un método con un parámetro de cadena y páselo al método Execute para recibir información sobre el progreso del método. Alternativamente, usted puede llamar al método y pasar el código de retroalimentación como un parámetro:
Execute(
delegate(string s)
{MessageBox.Show(s);} );
Así que todo dentro del paréntesis del método Execute () es el método anónimo y, por supuesto, se puede pasar en tantas líneas de código que desee. un punto importante a recalcar es que los métodos anónimos pueden ver realmente las variables locales definidas en el método de llamada. Así que esto funcionaria adecuadamente:
string s2 = "Prueba";
Execute(
delegate(string s)
{MessageBox.Show(s+s2);} )