¿Puede una expresión lambda de C # tener más de una declaración?
131
¿Puede una expresión lambda de C # incluir más de una declaración?
(Editar: como se menciona en varias de las respuestas a continuación, esta pregunta originalmente preguntaba sobre "líneas" en lugar de "declaraciones").
(Supongo que realmente estás hablando de múltiples declaraciones en lugar de múltiples líneas).
Puede usar varias declaraciones en una expresión lambda usando llaves, pero solo la sintaxis que no usa llaves se puede convertir en un árbol de expresión:
// ValidFunc<int,int> a = x => x +1;Func<int,int> b = x =>{return x +1;};Expression<Func<int,int>> c = x => x +1;// InvalidExpression<Func<int,int>> d = x =>{return x +1;};
Estoy tratando de entender por qué Func permite llaves y Expression no lo permite. De todos modos, Expression se cumplirá como Func. ¿Hay alguna forma de agregar lógica de línea múltiple al Árbol de expresión? Si no, ¿por qué hay que restringir eso?
Habeeb
8
@Habeeb: "De todos modos, Expression se cumplirá como Func" No siempre. La mayoría de las veces nunca se compila para un delegado, solo se examina como datos. Los árboles de expresión en .NET 4.0 obtuvieron la capacidad de incluir varias declaraciones a través de Expression.Block, pero el lenguaje C # no lo admite. Podría, pero eso requeriría más trabajo de diseño / implementación / prueba.
Jon Skeet
26
Puede poner tantas líneas nuevas como desee en una expresión lambda; C # ignora las nuevas líneas.
Probablemente quisiste preguntar sobre varias declaraciones .
Las declaraciones múltiples se pueden envolver entre llaves.
¿No sería más exacto decir que C # trata todos los espacios en blanco, incluidas las nuevas líneas, por igual? Suena un poco engañoso decir que ignora las nuevas líneas: hace que parezca que simplemente las elimina por completo, y podría dividir una palabra clave en una nueva línea o algo así.
Tesserex
6
Desde C # 7:
Declaración de una sola línea:
int expr(int x,int y)=> x + y +1;
Declaración multilínea:
int expr(int x,int y){int z =8;return x + y + z +1;};
aunque estas se llaman funciones locales, creo que esto se ve un poco más limpio que el siguiente y es efectivamente el mismo
Func<int,int,int> a =(x, y)=> x + y +1;Func<int,int,int> b =(x, y)=>{int z =8;return x + y + z +1;};
Polity está demostrando el formato de varias líneas solicitado por la pregunta, no entreteniendo sugerencias de golf. ¡Implementar su código inteligente lo haría "no una respuesta"!
El cuerpo de una declaración lambda puede constar de cualquier número de declaraciones; sin embargo, en la práctica, generalmente no hay más de dos o tres.
Action<int,int> action =(x, y)=>{ X += x; Y += y;};
Esto también puede ser útil si necesita escribir un método o constructor regular en una línea o cuando necesita más de una declaración / expresión para empaquetarse en una expresión:
publicvoidAction(int x,int y)=>(_, _)=(X += x, Y += y);
o
publicvoidAction(int x,int y)=> _ =(X += x, Y += y);
o
publicvoidAction(int x,int y)=>(X, Y)=(X + x, Y + y);
Respuestas:
Por supuesto:
fuente
(Supongo que realmente estás hablando de múltiples declaraciones en lugar de múltiples líneas).
Puede usar varias declaraciones en una expresión lambda usando llaves, pero solo la sintaxis que no usa llaves se puede convertir en un árbol de expresión:
fuente
Puede poner tantas líneas nuevas como desee en una expresión lambda; C # ignora las nuevas líneas.
Probablemente quisiste preguntar sobre varias declaraciones .
Las declaraciones múltiples se pueden envolver entre llaves.
Ver la documentación .
fuente
Desde C # 7:
Declaración de una sola línea:
Declaración multilínea:
aunque estas se llaman funciones locales, creo que esto se ve un poco más limpio que el siguiente y es efectivamente el mismo
fuente
fuente
De Lambda Expressions (Guía de programación de C #) :
fuente
Con c # 7.0 puedes usar así también
fuente
Digamos que tienes una clase:
Con el C # 7.0 dentro de esta clase, puede hacerlo incluso sin llaves:
y
sería lo mismo que:
Esto también puede ser útil si necesita escribir un método o constructor regular en una línea o cuando necesita más de una declaración / expresión para empaquetarse en una expresión:
o
o
Más sobre la deconstrucción de tuplas en la documentación .
fuente