¿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
- Pueden ser utilizados como Métodos anónimos.
- Árboles de expresiones.
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.
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.