Esta pagina se ve mejor con JavaScript habilitado

EXPRESIONES LAMBDA

 ·  ☕ 4 minutos lectura  ·  ✍️ Saturnino Pimentel

¿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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 se obtendría el siguiente resultado: 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.

compartir en

Saturnino Pimentel
Escrito por
Saturnino Pimentel
Software developer