Kann ein C # -Lambda-Ausdruck mehr als eine Anweisung enthalten?
(Bearbeiten: Wie in mehreren der folgenden Antworten erwähnt, wurde diese Frage ursprünglich eher nach "Zeilen" als nach "Aussagen" gestellt.)
Kann ein C # -Lambda-Ausdruck mehr als eine Anweisung enthalten?
(Bearbeiten: Wie in mehreren der folgenden Antworten erwähnt, wurde diese Frage ursprünglich eher nach "Zeilen" als nach "Aussagen" gestellt.)
Antworten:
(Ich gehe davon aus, dass Sie wirklich über mehrere Aussagen und nicht über mehrere Zeilen sprechen.)
Sie können mehrere Anweisungen in einem Lambda-Ausdruck mit geschweiften Klammern verwenden, aber nur die Syntax, die keine geschweiften Klammern verwendet, kann in einen Ausdrucksbaum konvertiert werden:
// 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; };
Sie können so viele Zeilenumbrüche in einen Lambda-Ausdruck einfügen, wie Sie möchten. C # ignoriert Zeilenumbrüche.
Sie wollten wahrscheinlich nach mehreren Aussagen fragen .
Mehrere Anweisungen können in geschweifte Klammern gesetzt werden.
Siehe die Dokumentation .
Seit C # 7:
Einzeilige Anweisung:
int expr(int x, int y) => x + y + 1;
Mehrzeilige Anweisung:
int expr(int x, int y) { int z = 8; return x + y + z + 1; };
Obwohl diese als lokale Funktionen bezeichnet werden, denke ich, dass dies ein bisschen sauberer aussieht als die folgenden und praktisch gleich ist
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;
}
Aus Lambda-Ausdrücken (C # -Programmierhandbuch) :
Der Hauptteil einer Lambda-Anweisung kann aus einer beliebigen Anzahl von Anweisungen bestehen. In der Praxis gibt es jedoch normalerweise nicht mehr als zwei oder drei.
Mit c # 7.0 können Sie auch so verwenden
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);
}
}
Angenommen, Sie haben eine Klasse:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Mit dem C # 7.0 in dieser Klasse können Sie dies auch ohne geschweifte Klammern tun:
Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);
und
Action<int, int> action = (x, y) => _ = (X += x, Y += y);
wäre das gleiche wie:
Action<int, int> action = (x, y) => { X += x; Y += y; };
Dies kann auch hilfreich sein, wenn Sie eine reguläre Methode oder einen Konstruktor in eine Zeile schreiben müssen oder wenn Sie mehr als eine Anweisung / einen Ausdruck benötigen, um in einen Ausdruck gepackt zu werden:
public void Action(int x, int y) => (_, _) = (X += x, Y += y);
oder
public void Action(int x, int y) => _ = (X += x, Y += y);
oder
public void Action(int x, int y) => (X, Y) = (X + x, Y + y);