Delegate

Un delegate es un objeto que hace referencia a uno o más métodos, previamente declarados en nuestra aplicación. Todos aquellos métodos que sean incluidos en él, tienen la particularidad de ser idénticos en cuanto al retorno y los parámetros que recibe. ¿Con todo esto qué quiero decir? ¿Cuál es el objetivo? La magia está en que, si nosotros creamos un delegate con una serie de métodos asociados, al llamar al mismo lanzará un método detrás de otro pasándole a cada uno de ellos el valor(es) con el que invocamos al delegate. Veamos un ejemplo:

delegate void Delegado(string cadena);

Si mi delegado es como el anterior, todos los métodos que contenga no deberán de retornar nada y necesitan como parámetro un string.
Esa sería la forma de declarar un delegado. Para continuar con el ejemplo, voy a crear dos métodos que cumplan las características del delegado (Esto es muy importante porque, de no ser así, lanzará una excepción).

public void Saludo(string cadena)
{
lblResult.Text += "Hola " + cadena;
}
public void Despedida(string cadena)
{
lblResult.Text += " Adios " + cadena;
}

La forma de asignar un método sería la siguiente:

protected void btnDelegado_Click(object sender, EventArgs e)
{
Delegado delegando = Saludo;
delegando += Despedida;
delegando(txtCadena.Text);
}

Para asignar el método Saludo, simplemente utilizo el símbolo = y, para añadir el método Despedida +=
Si quisiéramos eliminar en algún momento del delegado uno de los métodos, únicamente tendríamos que utilizar -= nombre_del_Metodo

¡Saludos!

3 comentarios en “Delegate”

  1. importante señalar que a partir de .NET 3.5 tenemos los delegados Func<> y Action<>, que nos permite evitar la mayoria de las declaraciones de delegados, en este ejemplo tuyo

    delegate void Delegado(string cadena);

    se puede reemplazar simplemente por:

    Action (delegado que toma un string y no regresa resultado (void)) directamente donde lo necesites, por ejemplo:

    Action delegando = Saludo;
    delegando += Despedida;
    delegando(txtCadena.Text);

    nota que ya no se requiere tener una declaracion exterior separada del delegado

    salu2

  2. también puedes usar expresiones lambda para crear delegados:

    static void Main(string[] args)
    {
    Action delegando = (x => Console.Out.WriteLine(“Hola ” + x));
    delegando += (x => Console.Out.WriteLine(“Adios ” + x));

    delegando(“Manolo”);
    }

  3. Gracias por vuestros comentarios 🙂
    En realidad estoy interesada en este asunto por la forma de trabajar con LINQ y bueno… Parece que este tema de delegados, expresiones lambda, etc. genera cierto miedo 😀
    Intentaré escribir más sobre los puntos que comentáis para intentar tener dos o tres pasos (post) de comprensión sobre este tema 😉

    ¡Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *