/ c#

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

  • Á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.

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.

Saturnino Pimentel

Saturnino Pimentel

Microsoft MVP, consultor, blogger y conferencista. Saturnino es el cofundador de la comunidad de programadores c# y el meetup de c# de la ciudad de México además de participar con otras comunidades.

Read More

Suscríbete a la lista de correos :)

* indicates required