¿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").
¿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").
Respuestas:
(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:
// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };
Expression<Func<int, int>> c = x => x + 1;
// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };
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 .
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; };
Func<string, bool> test = (name) =>
{
if (name == "yes") return true;
else return false;
}
De Lambda Expressions (Guía de programación de C #) :
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.
Con c # 7.0 puedes usar así también
Public string ParentMethod(int i, int x){
int calculation = (i*x);
(string info, int result) InternalTuppleMethod(param1, param2)
{
var sum = (calculation + 5);
return ("The calculation is", sum);
}
}
Digamos que tienes una clase:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Con el C # 7.0 dentro de esta clase, puede hacerlo incluso sin llaves:
Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);
y
Action<int, int> action = (x, y) => _ = (X += x, Y += y);
sería lo mismo que:
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:
public void Action(int x, int y) => (_, _) = (X += x, Y += y);
o
public void Action(int x, int y) => _ = (X += x, Y += y);
o
public void Action(int x, int y) => (X, Y) = (X + x, Y + y);
Más sobre la deconstrucción de tuplas en la documentación .