Delegados en C#: Funciones Anonimas

En el post anterior hablamos de los delegados, de la firma de una funcion y de como usarlos.

Ahora veremos el concepto de funciones anonimas

Funciones con nombre

La vez anterior nos quedamos con el siguiente codigo:

public class Algo
{
    // Definimos el nuevo tipo
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Le asignamos una implementacion 
        Add = ImplementacionDeLaSuma;
        //La usamos
        double res = Add(3.0f,5.0f)
    }

    double ImplementacionDeLaSuma ( float elNumeroA, float elNumeroB ){
        return elNumeroA + elNumeroB;
    }
}

En este ejemplo creamos un delegado llamado Suma y con ese delegado creamos una “variable” llamada Add.
Para poder utilizar nuestra variable Add le asignamos la funcion ImplementacionDeLaSuma, va a parecer redundante pero ImplementacionDeLaSuma es el nombre de una funcion, mediante ese nombre podemos hacer referencia a ella ya sea para mandarla llamar como funcion ImplementacionDeLaSuma() o utilizarla como “variable” y pasar la referencia de su implementacion a otra “variable” que tenga la misma firma.

Como vimos en el post anterior, el delegado y la función ImplementacionDeLaSuma comparten la misma firma lo que hace posible la igualacion (redundo por que es importante).

¿Y si pudieramos asignar la pura implementacion sin tener que crear una nueva función?

Eso es posible usando delegate de la siguiente forma:

delegate(parametros) { implementacion };

Los parametros: Que como en cualquier función son las variables con las que vamos a trabajar.
La implementacion: Es donde vamos a implementar, escribir, poner, el codigo a ejecutar.

Un ejemplo rápido seria el reescribir la funcion ImplementacionDeLaSuma con esta sintaxis de delegado, el resultado seria el siguiente.

delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };

Como veran en vez de darle un nombre a la funcion utilizamos la palabra reservada delegate como “nombre” de la funcion, y despues solo lo asignamos a nuestro delegado Add. A esto se le conoce como una.

Funcion Anonima

Una funcion anonima consiste en la pura implementacion sin un nombre con el cual se pueda hacer referencia a ella, es por eso que se asigna a una variable de tipo delegate para poder guardarla y utilizarla como vemos en el siguiente ejemplo.

Add = delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };

Esto hace cambiar nuestro ejemplo original y quedaria de la siguiente forma.

public class Algo
{
    // Definimos el nuevo tipo
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Le asignamos una implementacion mediante una funcion anonima
        Add = delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };
        //La usamos
        double res = Add(3.0f,5.0f)
    }

    // ya no necesitamos el metodo ImplementacionDeLaSuma
}

Las funciones anónimas son bastante utiles y poderosas ya que nos permiten asignar implementaciones de una forma rápida y practica además de que es una caracteristica muy usada en Linq, Asyncronos y otras características avanzadas de C#.

En el siguiente post hablaremos de un par de tipos de dato generico que nos sera muy util manipular delegados y funciones anonimas.

Leave a Reply

Your email address will not be published. Required fields are marked *