EXPRESIONES LAMBDA

¿Qué es una expresión lambda?

Según el msdn es una función anónima que puede contener expresiones e instrucciones y se puede utilizar para crear delegados o árboles de expresiones.

Investigando un poco más encontramos que las expresiones lambda son la apuesta de C# por la programación funcional y están basados en LISP y sus dialectos como Scheme.

Desde mi particular punto de vista (y supongo que desde el que las haya utilizado) me parecen una herramienta por demás poderosa y sencilla ya que no solo son una forma de implementar métodos anónimos sino que tienen la responsabilidad de ejecutar las consultas en LINQ (en algunos casos como métodos anónimos y en otros como poderosos árboles de expresiones).

¿Y qué tan sencillas de utilizar son?

Yo diría que bastante, las utilizaba sin saber que eran :).

El operador de lambda “=>” se lee “va a”. Está compuesto por tres partes la parte de la izquierda son los parámetros de entrada si es que son necesarios seguida por el operador lambda “=>” y por último en la parte derecha tiene lugar la expresión o el conjunto de sentencias necesarias para cumplir una funcionalidad.

Una de las principales características de las expresiones lambda (dejando de lado un poco C#) es que pueden ser tratadas tanto como piezas de código que pueden ser invocadas (delegados) o como valores que pueden ser manipulados por otros bloques de código (meta-programación).

En esta ocasión veremos su uso como métodos anónimos e iniciaremos como siempre con un ejemplo sencillo.

class Program  
{

    delegate int Operacion(int a,int b);

    static void Main(string[] args)
    {

        /*
        * En este caso asignamos la expresión lambda al delegado
        * pasando dos parámetros "a,b" y después realizando la suma de los elementos.
        */
        Operacion suma = (a, b) => a + b;

        // Solicitamos los valores asumiendo que son enteros.

        int c = int.Parse(Console.ReadLine());

        int d = int.Parse(Console.ReadLine());

        //Realizamos la operación.
        int e = suma(c, d);

        // Imprimimos el resultado en consola.
        Console.WriteLine(
            string.Format("El resultado de la suma de {0} + {1} es: {2}",c,d,e));

        Console.ReadLine();
    }

}

¡Algo raro ha pasado aquí! ¿Y los tipos en la expresión lambda ? ¿Y la palabra reservada return?

Se trata de otra más de las características de las expresiones lambda la “inferencia de tipos”. La “inferencia  de tipos”  es llevada a cabo por el compilador en base al cuerpo de la expresión lambda, el tipo de delegado subyacente y otros factores descritos en la especificación de lenguaje de C#. (Lo anterior resulta de especial utilidad cuando las utilizamos en LINQ).

Usos

Restricciones

  • En su uso como árboles de expresiones  una vez creados son inmutables.

  • No aceptan parámetros out.

A diferencia de los métodos anónimos  las expresiones lambda si aceptan parámetros ref  veamos un ejemplo.

class Program  
{

    delegate int Operacion(int a,int b);

    static void Main(string[] args)
    {

        // Solicitamos los valores asumiento que son enteros.

        int b = int.Parse(Console.ReadLine());

        int c = int.Parse(Console.ReadLine());

        /*
        * Ahora hacemos uso de otra característica más de las expresiones
        * lambda las cuáles al igual que los métodos anónimos permiten tener acceso a las variables externas.
        */
        Operacion suma = (ref int a) => a+c;

        // Realizamos la operación pasando el parametro por referencia "b"
        int e = suma(ref b);

        // Imprimimos el resultado en consola.
        Console.WriteLine(string.Format("El resultado de la suma de {0} + {1} es: {2}",b,c,e));

        Console.ReadLine();
    }

}

Para ambos ejemplos el resultado es el mismo.

resultado1

Sin mas por el momento me despido de ustedes no sin antes pedirles sus comentarios y que me cuenten sus experiencias con las expresiones Lambda. Saludos.