Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Kies een lambda-expressie als u een korte bewerking wilt doorgeven aan een andere methode en de bewerking is het duidelijkst naast de aanroep die deze gebruikt. Een inlineregel laat lezers zien hoe u items selecteert of transformeert; met een benoemde methode kunnen ze het doel van de bewerking volgen voordat ze de details ervan inspecteren.
Tip
In dit artikel worden praktische keuzes beschreven voor ontwikkelaars die C#-methoden en -verzamelingen kennen. Zie de verwijzing naar lambda-expressies voor de volledige lambda-syntaxis en -regels.
Een lambda-expressie is een niet-benoemde functie die u schrijft op de plek waar een ander stukje code gedrag nodig heeft.
De volgende lambda accepteert een sessie en retourneert of de sessie beschikbare plaatsen heeft:
session => session.Registered < session.Capacity
De => operator scheidt de parameters aan de linkerkant van de body aan de rechterkant. Lees het als 'gaat naar'.
Functionaliteit doorgeven aan een methode
Veel .NET API's accepteren een delegate, een type dat gedrag vertegenwoordigt met een bepaalde parameterlijst en retourtype. Een lambda biedt dat gedrag. Zie Action voor een inleiding tot delegatetypen, zoals en Func.
Het volgende voorbeeld werkt met workshopsessies. Een WorkshopSession bevat een titel, duur, capaciteit en aantal registraties.
int maximumMinutes = 60;
var shortSessions = sessions
.Where(session => session.DurationMinutes <= maximumMinutes)
.OrderBy(session => session.Title);
foreach (WorkshopSession session in shortSessions)
{
Console.WriteLine(session.Title);
}
De eerste lambda geeft Where aan welke sessies moeten worden bewaard. De tweede vertelt OrderBy op welke waarde moet worden gesorteerd. De methoden krijgen gedrag toegewezen zonder de details van een van beide regels te kennen.
Een parameterformulier kiezen
Kies het kortste parameterformulier dat duidelijk blijft:
session => session.DurationMinutes <= 60
Voor één parameter laat u haakjes weg wanneer de compiler het type kan afleiden. Gebruik lege haakjes zonder parameters:
() => DateTime.Now
Gebruik haakjes voor twee of meer parameters:
(left, right) => left + right
Meestal levert de methode die de lambda ontvangt voldoende informatie voor de compiler om parametertypen af te leiden. Schrijf expliciete typen wanneer type-inferentie hulp nodig heeft of wanneer de typen de duidelijkheid verbeteren:
(WorkshopSession session) => session.Title
De referentie voor lambda-expressies behandelt parametermodificatoren, attributen, standaardwaarden en andere gespecialiseerde vormen.
Een expressie of statement-body kiezen
Gebruik een expressie-lambda wanneer één expressie het resultaat berekent:
session => session.Registered < session.Capacity
Gebruik een statement-lambda wanneer de bewerking uit meer dan één instructie bestaat. Plaats het lichaam tussen accolades en neem return op wanneer de lambda een waarde retourneert:
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));
Houd statement lambdas beknopt. Wanneer de body meerdere stappen nodig heeft of dezelfde logica meerdere keren voorkomt, geef het gedrag een beschrijvende naam met een lokale functie of reguliere methode.
Waarden uit de omringende scope vastleggen
Een lambda kan een variabele gebruiken die is gedeclareerd in de omringende methode. Dit gebruik wordt vastleggen genoemd. In het eerste voorbeeld vangt de selectielambda maximumMinutes op:
int maximumMinutes = 60;
var shortSessions = sessions.Where(
session => session.DurationMinutes <= maximumMinutes);
Met Capture kan een korte regel lokale context gebruiken. De lambda legt de variabele zelf vast, niet een kopie van de waarde ervan. Als de variabele verandert voordat de lambda wordt uitgevoerd, ziet de lambda de huidige waarde.
Maak de benodigde context gemakkelijk te identificeren. Als een lambda geen omringende toestand nodig heeft, voeg static toe om onbedoelde capturing te voorkomen en die onafhankelijkheid zichtbaar te maken voor lezers:
var openSessions = sessions.Where(
static session => session.Registered < session.Capacity);
Een statische lambda kan zijn parameters, waarden die deze declareert, constanten en statische leden gebruiken. Het kan geen lokale variabelen of status van de instantie uit de omringende code gebruiken.
Een lambda, methodegroep of lokale functie kiezen
Verschillende C#-vormen kunnen gedrag leveren aan een delegateparameter:
- Gebruik een lambda-expressie voor korte logica die naast de aanroep duidelijk leesbaar is.
- Gebruik een methodegroep wanneer een bestaande methode de vereiste handtekening heeft en de naam het gedrag beschrijft.
- Gebruik een lokale functie wanneer het betreffende lid herbruikbare benoemde logica, recursie of een hoofdtekst nodig heeft die te groot is voor een inline lambda.
- Gebruik een reguliere methode wanneer meerdere members het gedrag nodig hebben.
Een method group is een methodenaam zonder de argumentlijst. De compiler converteert de overeenkomende methode naar het vereiste delegate-type:
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) communiceert dezelfde regel als Where(session => HasOpenSeats(session)) met minder code. De naam van de methode vertelt lezers wat de regel test; een inlinevergelijking laat zien hoe die vergelijking die regel test. Houd de lambda-wrapper wanneer deze een argument toevoegt, bewerkingen combineert of de aanroep duidelijker maakt.
Zie Lokale functies voor een gedetailleerde lokale vergelijking.