Wyrażenia lambda

Wybierz wyrażenie lambda, jeśli chcesz przekazać krótką operację do innej metody, a operacja jest najczystsza obok wywołania, które go używa. Reguła śródliniowa pokazuje czytelnikom sposób wybierania lub przekształcania elementów; nazwana metoda umożliwia im obserwowanie celu operacji przed sprawdzeniem jego szczegółów.

Wskazówka

W tym artykule przedstawiono praktyczne wybory dla deweloperów, którzy znają metody i kolekcje języka C#. Aby uzyskać pełną składnię lambda i reguły, zobacz dokumentację wyrażeń lambda.

Wyrażenie lambda to nienazwana funkcja, którą piszesz, gdzie inny fragment kodu wymaga zachowania.

Następująca funkcja lambda akceptuje sesję i zwraca, czy sesja ma otwarte miejsca:

session => session.Registered < session.Capacity

Operator => oddziela parametry po lewej stronie od treści po prawej stronie. Przeczytaj go jako "idzie do".

Przekazywanie zachowania do metody

Wiele interfejsów API .NET akceptuje delegata, który jest typem reprezentującym zachowanie z określoną listą parametrów i typem zwracanym. Lambda zapewnia to zachowanie. Aby zapoznać się z wprowadzeniem do typów delegatów, takich jak Func i Action, zobacz Wyrażenia lambda, delegaty i zdarzenia.

Poniższy przykład współpracuje z sesjami warsztatowymi. Element zawiera WorkshopSession tytuł, czas trwania, pojemność i liczbę rejestracji.

int maximumMinutes = 60;

var shortSessions = sessions
    .Where(session => session.DurationMinutes <= maximumMinutes)
    .OrderBy(session => session.Title);

foreach (WorkshopSession session in shortSessions)
{
    Console.WriteLine(session.Title);
}

Pierwsza lambda mówi Where , które sesje należy zachować. Drugi informuje OrderBy , według której wartości ma być sortowane. Metody odbierają zachowanie bez znajomości szczegółów każdej reguły.

Wybieranie formularza parametru

Wybierz najkrótszy formularz parametru, który pozostaje jasny:

session => session.DurationMinutes <= 60

W przypadku jednego parametru pomiń nawiasy, gdy kompilator może wywnioskować typ. Użyj pustych nawiasów bez parametrów:

() => DateTime.Now

Użyj nawiasów dla co najmniej dwóch parametrów:

(left, right) => left + right

Zazwyczaj metoda, która odbiera lambda dostarcza wystarczające informacje dla kompilatora do wnioskowania typów parametrów. Pisanie jawnych typów, gdy wnioskowanie wymaga pomocy lub kiedy typy zwiększają przejrzystość:

(WorkshopSession session) => session.Title

Dokumentacja wyrażeń lambda obejmuje modyfikatory parametrów, atrybuty, wartości domyślne i inne wyspecjalizowane formularze.

Wybieranie treści wyrażenia lub instrukcji

Użyj wyrażenia lambda , gdy jedno wyrażenie oblicza wynik:

session => session.Registered < session.Capacity

Użyj instrukcji lambda , gdy operacja wymaga więcej niż jednej instrukcji. Ujmij treść w nawiasach klamrowych i uwzględnij return , gdy lambda zwraca wartość:

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));

Zachowaj instrukcję lambdas brief. Gdy treść wymaga kilku kroków lub ta sama logika pojawia się więcej niż raz, nadaj zachowanie opisowej nazwie lokalnej funkcji lub zwykłej metody.

Przechwytywanie wartości z otaczającego zakresu

Lambda może używać zmiennej zadeklarowanej w otaczającej metodzie. Ta funkcja jest nazywana przechwytywaniem. W pierwszym przykładzie zaznaczenie lambda przechwytuje maximumMinuteselement :

int maximumMinutes = 60;
var shortSessions = sessions.Where(
    session => session.DurationMinutes <= maximumMinutes);

Przechwytywanie pomaga krótkiej regule używać kontekstu lokalnego. Funkcja lambda przechwytuje samą zmienną, a nie kopię jej wartości. Jeśli zmienna zmieni się przed uruchomieniem lambda, lambda zobaczy bieżącą wartość.

Ułatwiaj identyfikację potrzebnego kontekstu. Jeśli lambda nie potrzebuje otaczającego państwa, dodaj, static aby zapobiec przypadkowemu przechwytywaniu i uwidocznić to niezależność czytelnikom:

var openSessions = sessions.Where(
    static session => session.Registered < session.Capacity);

Statyczna lambda może używać swoich parametrów, wartości deklarowanych, stałych i statycznych elementów członkowskich. Nie może używać zmiennych lokalnych ani stanu wystąpienia z otaczającego kodu.

Wybieranie funkcji lambda, grupy metod lub funkcji lokalnej

Kilka formularzy języka C# może dostarczać zachowanie do parametru delegata:

  • Użyj wyrażenia lambda w celu krótkiego zachowania, które odczytuje wyraźnie obok wywołania.
  • Użyj grupy metod , gdy istniejąca metoda ma wymagany podpis, a jej nazwa wyjaśnia zachowanie.
  • Użyj funkcji lokalnej , gdy element członkowski zawierający wymaga wielokrotnego użytku nazwanej logiki, rekursji lub treści, która jest zbyt duża dla wbudowanej lambdy.
  • Użyj metody regularnej , gdy wielu członków potrzebuje zachowania.

Grupa metod jest nazwą metody bez listy argumentów. Kompilator konwertuje zgodną metodę na wymagany typ delegata:

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) komunikuje się z tą samą regułą co Where(session => HasOpenSeats(session)) w przypadku mniejszej ilości kodu. Nazwa metody informuje czytelników, co testuje reguła; porównanie wbudowane pokazuje, jak testuje regułę. Zachowaj otokę lambda, gdy dodaje argument, łączy operacje lub sprawia, że wywołanie jest jaśniejsze.

Aby uzyskać szczegółowe porównanie lokalne, zobacz Funkcje lokalne.

Informacje dodatkowe