Delen via


Expressiebomen

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 < 5vertegenwoordigt.

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: