Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wählen Sie einen Lambda-Ausdruck aus, wenn Sie einen kurzen Vorgang an eine andere Methode übergeben möchten und die Operation direkt neben dem Aufruf, der sie verwendet, am verständlichsten ist. Eine Inline-Regel zeigt Lesern, wie Sie Elemente auswählen oder umwandeln; eine benannte Methode ermöglicht es ihnen, den Zweck der Operation nachzuvollziehen, bevor sie sich mit den Details befassen.
Tip
In diesem Artikel werden praktische Optionen für Entwickler vermittelt, die C#-Methoden und -Kollektionen kennen. Die vollständige Lambda-Syntax und -Regeln finden Sie in der Lambda-Ausdrucksreferenz.
Ein Lambda-Ausdruck ist eine unbenannte Funktion, die Sie an einer Stelle schreiben, an der ein anderer Codeteil ein Verhalten benötigt.
Die folgende Lambda-Funktion akzeptiert eine Session und gibt zurück, ob die Session über offene Plätze verfügt:
session => session.Registered < session.Capacity
Der => Operator trennt die Parameter links vom Funktionskörper auf der rechten Seite. Lesen Sie dies als „Gehe zu“.
Verhalten an eine Methode übergeben
Viele .NET APIs akzeptieren einen Delegate, bei dem es sich um einen Typ handelt, der Verhalten mit einer bestimmten Parameterliste und einem bestimmten Rückgabetyp repräsentiert. Eine Lambda-Funktion stellt dieses Verhalten bereit. Eine Einführung in Delegattypen wie Func und Action finden Sie unter Lambda-Ausdrücke, Delegaten und Ereignisse.
Das folgende Beispiel funktioniert mit Workshopsitzungen. Ein WorkshopSession enthält einen Titel, eine Dauer, eine Kapazität und eine Registrierungsanzahl.
int maximumMinutes = 60;
var shortSessions = sessions
.Where(session => session.DurationMinutes <= maximumMinutes)
.OrderBy(session => session.Title);
foreach (WorkshopSession session in shortSessions)
{
Console.WriteLine(session.Title);
}
Die erste Lambda-Funktion gibt Where an, welche Sitzungen beibehalten werden sollen. Die zweite gibt an OrderBy , nach welchem Wert sortiert werden soll. Die Methoden erhalten ein Verhalten, ohne die Details beider Regeln zu kennen.
Wählen Sie ein Parameterformular aus.
Wählen Sie die kürzeste Parameterschreibweise, die klar bleibt:
session => session.DurationMinutes <= 60
Lassen Sie für einen Parameter Klammern aus, wenn der Compiler den Typ ableiten kann. Leere Klammern für keine Parameter verwenden:
() => DateTime.Now
Verwenden Sie Klammern für zwei oder mehr Parameter:
(left, right) => left + right
In der Regel liefert die Methode, die die Lambda-Funktion empfängt, genügend Informationen für den Compiler, um Parametertypen abzuleiten. Schreiben Sie explizite Typen, wenn die Typinferenz Hilfe benötigt oder wenn die Typen die Klarheit verbessern:
(WorkshopSession session) => session.Title
Die Referenz zu Lambdaausdrücken behandelt Parametermodifizierer, Attribute, Standardwerte und andere spezialisierte Formen.
Wählen Sie einen Ausdruck oder Anweisungsblock aus
Verwenden Sie ein Ausdruckslambda, wenn ein Ausdruck das Ergebnis berechnet:
session => session.Registered < session.Capacity
Verwenden Sie ein Anweisungs-Lambda, wenn der Vorgang mehr als eine Anweisung benötigt. Schließen Sie den Textkörper in geschweifte Klammern ein, und fügen Sie return ein, wenn die Lambda-Funktion einen Wert zurückgibt:
var descriptions = sessions.Select(session =>
{
int seatsLeft = session.Capacity - session.Registered;
string availability = seatsLeft > 0 ? $"{seatsLeft} seats left" : "full";
return $"{session.Title}: {availability}";
});
Console.WriteLine(string.Join(Environment.NewLine, descriptions));
Halten Sie Anweisungslambdas kurz. Wenn der Code mehrere Schritte erfordert oder dieselbe Logik mehrmals vorkommt, gib dem Verhalten einen aussagekräftigen Namen und fasse es in einer lokalen Funktion oder einer regulären Methode zusammen.
Erfassen von Werten aus dem umgebenden Gültigkeitsbereich
Eine Lambda-Funktion kann eine variable verwenden, die in der umgebenden Methode deklariert ist. Diese Verwendung wird als Capture bezeichnet. Im ersten Beispiel schließt die Auswahl-Lambda maximumMinutes ein:
int maximumMinutes = 60;
var shortSessions = sessions.Where(
session => session.DurationMinutes <= maximumMinutes);
Capture hilft einer kurzen Regel, den lokalen Kontext zu nutzen. Die Lambda-Funktion schließt die Variable selbst ein, nicht eine Kopie ihres Werts. Wenn sich die Variable vor dem Ausführen der Lambda-Funktion ändert, greift die Lambda auf den aktuellen Wert zu.
Machen Sie den erforderlichen Kontext leicht erkennbar. Wenn eine Lambda-Funktion keinen umgebenden Zustand benötigt, fügen Sie hinzu static , um versehentliche Erfassungen zu verhindern und diese Unabhängigkeit für Leser sichtbar zu machen:
var openSessions = sessions.Where(
static session => session.Registered < session.Capacity);
Eine statische Lambda-Funktion kann ihre Parameter, von ihr deklarierte Werte, Konstanten und statische Member verwenden. Es kann keine lokalen Variablen oder den Instanzzustand aus dem umgebenden Code verwenden.
Wählen Sie ein Lambda, eine Methodengruppe oder eine lokale Funktion aus
Mehrere C#-Formulare können ein Verhalten für einen Delegatparameter bereitstellen:
- Verwenden Sie einen Lambda-Ausdruck für kurzes Verhalten, das sich neben dem Aufruf gut lesen lässt.
- Verwenden Sie eine Methodengruppe , wenn eine vorhandene Methode über die erforderliche Signatur verfügt und ihr Name das Verhalten erläutert.
- Verwenden Sie eine lokale Funktion, wenn das enthaltende Element wiederverwendbare benannte Logik, Rekursion oder einen Funktionskörper benötigt, der für eine Inline-Lambda-Funktion zu groß ist.
- Verwenden Sie eine reguläre Methode, wenn mehrere Member das Verhalten benötigen.
Eine Methodengruppe ist ein Methodenname ohne Argumentliste. Der Compiler konvertiert die passende Methode in den erforderlichen Delegattyp:
var openSessions = sessions.Where(HasOpenSeats);
foreach (WorkshopSession session in openSessions)
{
Console.WriteLine($"Open: {session.Title}");
}
static bool HasOpenSeats(WorkshopSession session) =>
session.Registered < session.Capacity;
Where(HasOpenSeats) kommuniziert die gleiche Regel wie Where(session => HasOpenSeats(session)) bei weniger Code. Der Methodenname teilt lesern mit, was die Regel testet; Ein Inlinevergleich zeigt, wie diese Regel getestet wird. Behalten Sie den Lambda-Wrapper bei, wenn er ein Argument hinzufügt, Vorgänge kombiniert oder den Aufruf klarer macht.
Einen detaillierten lokalen Vergleich finden Sie unter Lokale Funktionen.