Uma expressão lambda C # pode incluir mais de uma instrução?
(Edit: Como mencionado em várias das respostas abaixo, esta pergunta foi feita originalmente sobre "linhas" em vez de "declarações".)
Uma expressão lambda C # pode incluir mais de uma instrução?
(Edit: Como mencionado em várias das respostas abaixo, esta pergunta foi feita originalmente sobre "linhas" em vez de "declarações".)
Respostas:
(Suponho que você esteja realmente falando sobre várias declarações em vez de várias linhas).
Você pode usar várias instruções em uma expressão lambda usando chaves, mas apenas a sintaxe que não usa chaves pode ser convertida em uma árvore de expressões:
// 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; };
Você pode colocar quantas linhas novas desejar em uma expressão lambda; C # ignora novas linhas.
Você provavelmente quis perguntar sobre várias declarações .
Várias instruções podem ser colocadas entre chaves.
Veja a documentação .
Desde o C # 7:
Declaração de linha única:
int expr(int x, int y) => x + y + 1;
Declaração multilinha:
int expr(int x, int y) { int z = 8; return x + y + z + 1; };
embora sejam chamadas de funções locais, acho que isso parece um pouco mais limpo que o seguinte e é efetivamente o mesmo
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;
}
Nas expressões Lambda (Guia de Programação em C #) :
O corpo de uma instrução lambda pode consistir em qualquer número de instruções; no entanto, na prática, normalmente não há mais que dois ou três.
Com o c # 7.0, você pode usar assim também
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 você tenha uma aula:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Com o C # 7.0 dentro dessa classe, você pode fazer isso mesmo sem colchetes:
Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);
e
Action<int, int> action = (x, y) => _ = (X += x, Y += y);
seria o mesmo que:
Action<int, int> action = (x, y) => { X += x; Y += y; };
Isso também pode ser útil se você precisar escrever o método ou construtor regular em uma linha ou quando precisar de mais de uma instrução / expressão para ser compactada em uma expressão:
public void Action(int x, int y) => (_, _) = (X += x, Y += y);
ou
public void Action(int x, int y) => _ = (X += x, Y += y);
ou
public void Action(int x, int y) => (X, Y) = (X + x, Y + y);
Mais sobre a desconstrução de tuplas na documentação .