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.

José Saturnino Pimentel Juárez

Leer más posts.

Ciudad de México

Suscríbete al blog

Obtén los últimos post en tu correo

Suscríbete a la lista de correos.

*obligatorio
o suscríbete via RSS con Feedly!