Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Fråge- och axeloperationer implementeras ofta för att tillämpa uppskjuten exekvering. Den här artikeln beskriver kraven och fördelarna med uppskjuten körning och vissa implementeringsöverväganden.
Uppskjuten körning
Uppskjutet verkställande innebär att utvärderingen av ett uttryck fördröjs tills dess faktiska värde faktiskt krävs. Uppskjuten körning kan avsevärt förbättra prestanda när du måste hantera stora datamängder, särskilt i program som innehåller en serie sammankopplade frågeställningar eller manipulationer. I bästa fall möjliggör uppskjuten körning endast en enskild iteration via källsamlingen.
LINQ-teknikerna använder sig av uppskjuten körning både i kärnklasserna System.Linq och i tilläggsmetoderna i de olika LINQ-namnrymderna, till exempel System.Xml.Linq.Extensions.
Uppskjuten körning stöds direkt i C#-språket av nyckelordet yield (C# Reference) (i form av yield-return-satsen) när det används i ett iteratorblock. En sådan iterator måste returnera en samling av typen IEnumerator eller IEnumerator<T> (eller en härledd typ).
Ivrig kontra lat utvärdering
När du skriver en metod som implementerar uppskjuten körning måste du också bestämma om du vill implementera metoden med hjälp av lat utvärdering eller ivrig utvärdering.
- I lat utvärdering bearbetas ett enda element i källsamlingen under varje anrop av iteratorn. Det här är det typiska sättet som iteratorer implementeras på.
- I ivrig utvärdering resulterar det första anropet till iteratorn i att hela samlingen bearbetas. En tillfällig kopia av källsamlingen kan också krävas. Metoden måste till exempel OrderBy sortera hela samlingen innan den returnerar det första elementet.
Lat utvärdering ger vanligtvis bättre prestanda eftersom den fördelar bearbetningen jämnt under utvärderingen av samlingen och minimerar användningen av tillfälliga data. För vissa åtgärder finns det naturligtvis inget annat alternativ än att materialisera mellanliggande resultat.
Se Exempel på uppskjuten körning för ett exempel på programmering med uppskjuten körning i C# och Visual Basic.