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.
Expressiestructuren vertegenwoordigen code in een structuurachtige gegevensstructuur, waarbij elk knooppunt een expressie is, bijvoorbeeld een methodeaanroep of een binaire bewerking, zoals x < y
.
Als u LINQ hebt gebruikt, hebt u ervaring met een uitgebreide bibliotheek waarin de Func
typen deel uitmaken van de API-set. (Als u niet bekend bent met LINQ, wilt u waarschijnlijk de LINQ-zelfstudie en het artikel over lambda-expressies voor deze lezen.) Expressiestructuren bieden een rijkere interactie met de argumenten die functies zijn.
U schrijft functieargumenten, meestal met lambda-expressies, wanneer u LINQ-query's maakt. In een typische LINQ-query worden deze functie-argumenten omgezet in een delegate die door de compiler wordt gemaakt.
U schrijft al code die gebruikmaakt van expressiestructuren. De LINQ API's van Entity Framework accepteren expressiestructuren als de argumenten voor het LINQ-queryexpressiepatroon. Hierdoor kan Entity Framework de query die u in C# hebt geschreven, vertalen naar SQL die wordt uitgevoerd in de database-engine. Een ander voorbeeld is Moq, een populair mocking framework voor .NET.
Als u een uitgebreidere interactie wilt hebben, moet u Expressiestructuren gebruiken. Expressiestructuren vertegenwoordigen code als een structuur die u onderzoekt, wijzigt of uitvoert. Deze hulpprogramma's bieden u de kracht om code tijdens runtime te bewerken. U schrijft code die actieve algoritmen onderzoekt of nieuwe mogelijkheden injecteert. In geavanceerdere scenario's wijzigt u actieve algoritmen en vertaalt u zelfs C#-expressies in een andere vorm voor uitvoering in een andere omgeving.
U compileert en voert code uit die wordt vertegenwoordigd door expressiestructuren. Het bouwen en uitvoeren van expressiestructuren maakt dynamische aanpassing van uitvoerbare code mogelijk, de uitvoering van LINQ-query's in verschillende databases en het maken van dynamische query's. Zie Expressiestructuren gebruiken om dynamische query's te bouwen voor meer informatie over expressiestructuren in LINQ.
Expressiestructuren worden ook gebruikt in de Dynamic Language Runtime (DLR) om interoperabiliteit te bieden tussen dynamische talen en .NET en om compilerschrijvers in staat te stellen expressiestructuren te genereren in plaats van de Microsoft tussentaal (CIL). Zie Het overzicht van Dynamic Language Runtime voor meer informatie over de DLR.
U kunt de C# of Visual Basic-compiler een expressiestructuur laten maken op basis van een anonieme lambda-expressie of u kunt expressiestructuren handmatig maken met behulp van de System.Linq.Expressions naamruimte.
Wanneer een lambda-expressie wordt toegewezen aan een variabele van het type Expression<TDelegate>, verzendt de compiler code om een expressiestructuur te bouwen die de lambda-expressie vertegenwoordigt.
De volgende codevoorbeelden laten zien hoe de C#-compiler een expressiestructuur maakt die de lambda-expressie num => num < 5
vertegenwoordigt.
Expression<Func<int, bool>> lambda = num => num < 5;
U maakt expressiebomen in uw code. u bouwt de boom door elk knooppunt te maken en de knooppunten aan een boomstructuur te koppelen. U leert hoe u expressies maakt in het artikel over het bouwen van expressiestructuren.
Expressiestructuren zijn onveranderbaar. Als u een expressiestructuur wilt wijzigen, moet u een nieuwe expressiestructuur maken door de bestaande structuur te kopiëren en knooppunten erin te vervangen. U gebruikt een expressiestructuurbezoeker om de bestaande expressiestructuur te doorlopen. Zie het artikel over het vertalen van expressiestructuren voor meer informatie.
Zodra u een expressiestructuur hebt gebouwd, voert u de code uit die wordt vertegenwoordigd door de expressiestructuur.
Beperkingen
De C#-compiler genereert alleen expressiebomen van expressielambda's (of lambda's met één regel). Het kan uitdrukking-lambdas (of lambdas met meerdere regels) niet parsen. Zie Lambda-expressies voor meer informatie over lambda-expressies in C#.
Er zijn nieuwere C#-taalelementen die niet goed worden omgezet in expressiestructuren. Expressiebomen kunnen geen await
expressies of async
lambda-expressies bevatten. Veel van de functies die zijn toegevoegd in C# 6 en hoger, lijken niet precies zoals geschreven in expressiestructuren. In plaats daarvan worden nieuwere functies weergegeven in expressiestructuren in de equivalente, eerdere syntaxis, waar mogelijk. Andere constructies zijn niet beschikbaar. Dit betekent dat code waarmee expressiestructuren worden geïnterpreteerd, hetzelfde werkt wanneer nieuwe taalfuncties worden geïntroduceerd. Zelfs met deze beperkingen kunt u met expressiestructuren dynamische algoritmen maken die afhankelijk zijn van het interpreteren en wijzigen van code die wordt weergegeven als een gegevensstructuur. Het maakt uitgebreide bibliotheken zoals Entity Framework mogelijk om te bereiken wat ze doen.
Expressiestructuren ondersteunen geen nieuwe typen expressieknooppunten. Het zou een belangrijke wijziging zijn voor alle bibliotheken die expressiestructuren interpreteren om nieuwe knooppunttypen te introduceren. De volgende lijst bevat de meeste C#-taalelementen die niet kunnen worden gebruikt:
- Voorwaardelijke methoden verwijderd uit de uitvoer
-
base
toegang - Methodegroepexpressies, waaronder adres-van (
&
) een methodegroep en anonieme methode-expressies - Verwijzingen naar lokale functies
- Instructies, inclusief toewijzing (
=
) en uitdrukkingen met een instructielichaam - Gedeeltelijke methoden met alleen een definiërende declaratie
- Onveilige aanwijzerbewerkingen
-
dynamic
bewerkingen -
Coalescerende operatoren met
null
ofdefault
letterlijke linkerzijde, null-samenvoegtoewijzing en de null-propagatieoperator (?.
) - Multidimensionale matrix-initialisatiefuncties, geïndexeerde eigenschappen en initialisatiefuncties voor woordenlijst
- verzamelingsuitdrukkingen
-
throw
uitdrukkingen - Toegang tot
static virtual
ofabstract
interfaceleden - Lambda-expressies met kenmerken
- Geïnterpoleerde tekenreeksen
- UTF-8-tekenreeksconversies of letterlijke UTF-8-tekenreeksen
- Methode-aanroepen met behulp van variabeleargumenten, benoemde argumenten of optionele argumenten
- Expressies die System.Index of System.Range gebruiken, index 'from end' operator (
^
) of bereikexpressies (..
) gebruiken -
async
lambda expressies ofawait
expressies, inclusiefawait foreach
enawait using
-
Letterlijke tuples, tupleconversies, tuple
==
of!=
with
expressies -
Verwijdert (
_
), deconstructing toewijzing, patroonkoppelingsoperatoris
of de expressie voor patroonkoppelingswitch
- COM-aanroep met
ref
weggelaten uit de argumenten -
ref
,in
ofwelout
parameters,ref
retourwaarden,out
argumenten ofwel waarden van hetref struct
type