Una expresión lambda es una forma de escribir una función anónima, es decir, una función sin nombre. Lo que tienes en el lado izquierdo de la "flecha" son los parámetros de la función, y lo que tienes en el lado derecho es el cuerpo de la función. Por lo tanto, (x => x.Name)
se traduce lógicamente a algo así como string Function(Data x) { return x.Name }
, los tipos string
y Data
obviamente variarán y se derivarán del contexto.
La ausencia del parámetro del lado izquierdo se traduce en una función sin parámetros, por lo que este (() => someVariable)
traduce lógicamente a esto: string Function() { return someVariable; }
En este punto es posible que empezar a preguntarse, donde someVariable
proviene, no es una función parámetro y no está definido en la función. Estaría en lo cierto, una función como esta nunca compilaría. Sin embargo, la función lambda como esta está perfectamente bien, ya que permite levantar variables de alcance externo y usarlas de esta manera. (Internamente, se crea una clase contenedora donde las variables que se usan en la expresión lambda se convierten en campos).
Ahora veamos qué significa model => item.FirstName
. Lógicamente se traduciría a string Function(Model model) { return item.FirstName; }
. Básicamente esta es una función con un parámetro, pero este parámetro no se usa.
Y ahora, el último bit de la información. Aunque las expresiones lambda representan funciones al final, a veces se crean no con el propósito de ser realmente ejecutadas (aunque potencialmente pueden). Una expresión lambda se puede representar en la forma de un árbol de expresión. Esto significa que en lugar de ejecutarlo puede ser analizado.
En este caso particular, el motor MVC no ejecuta la función que representa la expresión lambda. En cambio, la expresión es analizada para que el motor MVC sepa qué html debe emitir para esta línea en particular. Si su elemento de datos no proviene directamente de su objeto modelo, la parte izquierda de la expresión lambda no tiene importancia.
¿Ha probado que la aplicación? ¿Funciona? Sería bueno utilizar la notación de puntos de esa manera, tenía la impresión de que solo se podía acceder a través de índices. –
sí, es lo que veo ver en los tutoriales y lo he estado haciendo yo mismo por un tiempo. Sin embargo, siempre me he preguntado por qué no modelItem => modelItem.FirstName ... también lo intenté y no funcionó. Sí, sería mucho mejor usar notación de puntos. A mi me parece un "truco" en cierto modo. Espero que la notación de puntos sea posible en el futuro ... –
Según el enlace de 'GraemeMiller', una forma más adecuada sería' @ Html.DisplayFor ((= = item.FirstName) ' –