Performancing Metrics

Expresiones lambda - Return(GiS);

Return(GiS);

Expresiones lambda

Dado que hoy en día lo que se estila es el uso de las expresiones lambda, voy a intentar resumir en un solo post qué son y cómo se utilizan. Sobre todo voy a procurar simplificarlo lo más posible :)

Las expresiones lambda se utilizan para crear funciones anónimas las cuales pueden ser asignadas a delegados o a árboles de expresión.

¿Por qué anónimas?

Porque no necesitamos asignarles un nombre para referirnos a ellas.

¿Qué es un delegado?

Es un objeto que hace referencia a uno o más métodos. Más información aquí.

¿Qué es un árbol de expresión?

Un árbol de expresión representa una estructura en forma de árbol de las expresiones lambda en memoria. Generalmente se potencia su uso en LINQ.

¿Cómo se utilizan?

Para saber cómo utilizar y/o leer una expresión lambda debemos tener en cuenta los siguientes puntos:

  • Parte izquierda: Representa los parámetros  que intervienen en la expresión.
  • Parte central: Se trata del operador lambda, necesario en todas las expresiones de este tipo.
  • Parte derecha: Se definen las acciones a realizar.

 

Puntos importantes:

  1. Las expresiones lambda no utiliza la instrucción return, excepto aquellas que utilicen un bloque encerrado entre llaves.
    suma = (a, b) =>
    {
    return a + b;
    };

  2. No es necesario especificar el tipo de los parámetros, ya que siempre van asociados a un delegado que ya contiene esta información.
    delegate string Delegado(int edad);

    [...]

    Delegado edad = e => string.Format("Tu edad es {0}", e);

  3. Se pueden usar tanto por delegados creados por nosotros como por aquellos definidos por el framework.
    <%= Html.TextBoxFor(m => m.Name) %>

LOS DELEGADOS GENÉRICOS: ACTION Y FUNC

Por otro lado, podemos utilizar los siguientes delegados genéricos en lugar de delegate. Con ellos conseguimos una sintaxis algo más refinada y simple.

Action
se utiliza para aquellas expresiones lambda que no retornan ningún valor.

Action<string> saludo = s => Console.Write("Hola {0}!", s);
saludo("Gisela");

Func para aquellas expresiones que retornen un valor.

Func<int, int, int> suma = (a, b) => a + b;
int resultado = suma(3, 5);

Tanto en el caso de Func como en Action el número máximo de parámetros permitido es cuatro (Func figurará como cinco ya que el último es considerado el valor de retorno).

Espero que haya servido como una pequeña introducción al respecto ;)

¡Saludos!

Posted: 22/2/2010 23:22 por Gisela | con 8 comment(s)
Archivado en:
Comparte este post:

Comentarios

Vicente ha opinado:

Muy buena intro Gis! :)

# February 23, 2010 12:11 AM

Eugenio Estrada ha opinado:

Haciendo pruebas con Expresiones Lambda y Dynamic de C# 4.0, llegue a algo similar a esto:

Func<dynamic, dynamic, dynamic> algo = a, b => b(a);

Básicamente es aplicar una función a un valor, pudiendo hacer:

algo(Math.Abs, -20);

:-P

Dynamic + Functional me parece muy versatil :-D

# February 23, 2010 12:20 AM

Julio Trujillo Leon ha opinado:

Hola Gisela

Haces referncia a una expresion lambda en C# con el operador de ámbito como este ejemplo:

suma = (a, b) =>                

{                    

return a + b;                

};

Con dicho operador puedes componer una expresion de varias líneas de código. Sin embargo yo trabajo en VB.NET y no he visto manera de poder expresar una expresion lambda en varias líneas de código (quizás por desconocimiento mío) ¿Sabes si se puede hacer y cómo?

Gracias

# February 23, 2010 8:48 AM

Javier Torrecilla ha opinado:

Muy buen articulo Gisela!

# February 23, 2010 9:28 AM

Gisela ha opinado:

Gracias a todos por vuestros comentarios.

@Julio en cuanto a tu pregunta, una de las novedades que traerá Visual Basic 2010 será el soporte multi-línea en las expresiones lambda y subrutinas, lo cual hasta ahora no soportaba :(

Te dejo un link para que puedas echarle un vistazo de cómo será posible.

¡Saludos!

# February 23, 2010 9:55 AM

Joaquín Sosa Martín ha opinado:

Muy bien Gisela, claro y conciso.

# February 23, 2010 6:43 PM

Eber Irigoyen ha opinado:

Excelente introduccion, solo no entendi porque dices que los arboles de expresion son usados

"más concretamente con LINQ To XML."

Creo que los beneficios de los arboles de expresion son utiles para cualquier implementacion de LINQ, ya que son las expresiones lambdas, convertidas basicamente a datos, para que puedan ser traducidas al destino que se les este dando a estas, LINQ to DB, XML, etc.

Un tip adicional por algo que he notado que batallan algunos developers, con el delegato generico Action<T>, si quisieras usarlo para un metodo que no toma parametros ni regresa valor (void), tendrias que usar el tipo Action (el no generico), si se analiza un poquito tiene sentido, porque Action<T> nunca regresa valor (void), asi que si no tenemos ningun parametro, pues no hay ningun <T> que usar

salu2

# February 23, 2010 7:19 PM

Gisela ha opinado:

Gracias Joaquín y Eber por vuestros comentarios :)

@Eber, tienes razón, la verdad es que no recuerdo por qué concreté con XML ya que se usa en todas ellas ¡Actualizado! Gracias por tu última aportación ;)

¡Saludos!

# February 23, 2010 7:47 PM