Un'espressione lambda C # può includere più di un'istruzione?
(Modifica: come indicato in molte delle risposte di seguito, questa domanda originariamente poneva domande su "righe" anziché "istruzioni".)
Un'espressione lambda C # può includere più di un'istruzione?
(Modifica: come indicato in molte delle risposte di seguito, questa domanda originariamente poneva domande su "righe" anziché "istruzioni".)
Risposte:
(Suppongo che tu stia davvero parlando di più dichiarazioni piuttosto che più righe.)
Puoi usare più istruzioni in un'espressione lambda usando le parentesi graffe, ma solo la sintassi che non usa le parentesi graffe può essere convertita in un albero di espressioni:
// 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; };
Puoi inserire tutte le nuove righe che vuoi in un'espressione lambda; C # ignora le nuove righe.
Probabilmente intendevi chiedere più dichiarazioni .
Più istruzioni possono essere racchiuse tra parentesi graffe.
Vedere la documentazione di .
Da C # 7:
Dichiarazione a riga singola:
int expr(int x, int y) => x + y + 1;
Dichiarazione multilinea:
int expr(int x, int y) { int z = 8; return x + y + z + 1; };
sebbene queste siano chiamate funzioni locali, penso che questo appaia un po 'più pulito del seguente ed è effettivamente lo stesso
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;
}
Da Lambda Expressions (Guida per programmatori C #) :
Il corpo di una dichiarazione lambda può essere costituito da un numero qualsiasi di dichiarazioni; tuttavia, in pratica non ci sono in genere più di due o tre.
Con c # 7.0 È possibile utilizzare anche in questo modo
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);
}
}
Supponiamo che tu abbia una lezione:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Con il C # 7.0 all'interno di questa classe puoi farlo anche senza parentesi graffe:
Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);
e
Action<int, int> action = (x, y) => _ = (X += x, Y += y);
sarebbe lo stesso di:
Action<int, int> action = (x, y) => { X += x; Y += y; };
Questo potrebbe anche essere utile se devi scrivere un metodo o un costruttore regolare in una riga o quando hai bisogno di più di un'istruzione / espressione da impacchettare in una espressione:
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);
Maggiori informazioni sulla decostruzione delle tuple nella documentazione .