Verzögerte Ausführung und Auswertung in LINQ to XML (C#)Deferred Execution and Lazy Evaluation in LINQ to XML (C#)

Abfrage- und Achsenoperationen werden oft so implementiert, dass sie die verzögerte Ausführung (Deferred Execution) verwenden.Query and axis operations are often implemented to use deferred execution. In diesem Thema werden die Voraussetzungen und die Vorteile der verzögerten Ausführung erläutert und einige Überlegungen zur Implementierung angestellt.This topic explains the requirements and advantages of deferred execution, and some implementation considerations.

Verzögerte AusführungDeferred Execution

Verzögerte Ausführung bedeutet, dass die Auswertung eines Ausdrucks so lange hinausgezögert wird, bis dessen realisierter Wert tatsächlich benötigt wird.Deferred execution means that the evaluation of an expression is delayed until its realized value is actually required. Dort, wo große Datensammlungen bearbeitet werden müssen, vor allem in Programmen, die eine Reihe von verketteten Abfragen oder Manipulationen enthalten, kann die verzögerte Ausführung die Arbeitsgeschwindigkeit der Anwendung signifikant erhöhen.Deferred execution can greatly improve performance when you have to manipulate large data collections, especially in programs that contain a series of chained queries or manipulations. Im besten Fall muss bei der verzögerten Ausführung lediglich ein Durchlauf durch die Quellauflistung erfolgen.In the best case, deferred execution enables only a single iteration through the source collection.

Die LINQ-Technologien machen von der verzögerten Ausführung umfangreichen Gebrauch, und dies sowohl bei den Membern der System.Linq-Kernklassen als auch bei den Erweiterungsmethoden in den verschiedenen LINQ-Namespaces, z. B. System.Xml.Linq.Extensions.The LINQ technologies make extensive use of deferred execution in both the members of core System.Linq classes and in the extension methods in the various LINQ namespaces, such as System.Xml.Linq.Extensions.

Die verzögerte Auswertung wird in der C#-Sprache direkt durch das yield-Schlüsselwort (in Form der yield-return-Anweisung) im Iteratorblock unterstützt.Deferred execution is supported directly in the C# language by the yield keyword (in the form of the yield-return statement) when used within an iterator block. So ein Iterator muss eine Auflistung des Typs IEnumerator oder IEnumerator<T> (oder eines abgeleiteten Typs) zurückgeben.Such an iterator must return a collection of type IEnumerator or IEnumerator<T> (or a derived type).

Vergleich von sofortiger Auswertung und verzögerter AuswertungEager vs. Lazy Evaluation

Beim Schreiben einer Methode, die die verzögerte Ausführung implementiert, können Sie sich auch überlegen, ob die Methode mit verzögerter Auswertung (Lazy Evaluation) oder sofortiger Auswertung (Eager Evaluation) implementiert werden soll.When you write a method that implements deferred execution, you also have to decide whether to implement the method using lazy evaluation or eager evaluation.

  • Bei der verzögerten Auswertung wird bei jedem Aufruf des Iterators jeweils ein Element der Quellauflistung verarbeitet.In lazy evaluation, a single element of the source collection is processed during each call to the iterator. Dies ist die übliche Art und Weise, in der Iteratoren implementiert werden.This is the typical way in which iterators are implemented.

  • Bei der sofortigen Auswertung wird beim ersten Aufruf des Iterators die gesamte Auflistung verarbeitet.In eager evaluation, the first call to the iterator will result in the entire collection being processed. Eventuell ist auch eine temporäre Kopie der Quellauflistung erforderlich.A temporary copy of the source collection might also be required. So muss z. B. die OrderBy-Methode die gesamte Auflistung erst sortieren, bevor sie das erste Element zurückgibt.For example, the OrderBy method has to sort the entire collection before it returns the first element.

Die verzögerte Auswertung hat in der Regel eine höhere Arbeitsgeschwindigkeit zur Folge, weil die Verarbeitung des Mehraufwands gleichmäßig auf die Auswertung der Auflistung verteilt und die Verwendung temporärer Daten minimiert wird.Lazy evaluation usually yields better performance because it distributes overhead processing evenly throughout the evaluation of the collection and minimizes the use of temporary data. Bei einigen Operationen führt aber natürlich kein Weg an der Materialisierung der Zwischenergebnisse vorbei.Of course, for some operations, there is no other option than to materialize intermediate results.

Nächste SchritteNext Steps

Die verzögerte Ausführung ist Gegenstand des nächsten Themas dieses Lernprogramms:The next topic in this tutorial illustrates deferred execution:

Siehe auchSee Also

Tutorial: Verketten von Abfragen (C#)Tutorial: Chaining Queries Together (C#)
Konzepte und Terminologie (funktionale Transformation) (C#)Concepts and Terminology (Functional Transformation) (C#)
Aggregation Operations (C#) (Aggregationsvorgänge (C#))Aggregation Operations (C#)
yieldyield