Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Abfrage- und Achsenoperationen werden oft so implementiert, dass sie die verzögerte Ausführung (Deferred Execution) verwenden. In diesem Artikel werden die Anforderungen und Vorteile der verzögerten Ausführung sowie einige Implementierungsüberlegungen erläutert.
Verzögerte Ausführung
Verzögerte Ausführung bedeutet, dass die Auswertung eines Ausdrucks verzögert wird, bis der realisierte Wert tatsächlich erforderlich ist. Die verzögerte Ausführung kann die Leistung erheblich verbessern, wenn Sie umfangreiche Datensammlungen bearbeiten müssen, insbesondere in Programmen, die eine Reihe von verketteten Abfragen oder Manipulationen enthalten. Im besten Fall ermöglicht die verzögerte Ausführung nur eine einzelne Iteration durch die Quellauflistung.
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.
Die verzögerte Ausführung wird direkt in der C#-Sprache durch das Schlüsselwort "Rendite" (C# Reference) ( in Form der yield-return
Anweisung) unterstützt, wenn sie in einem Iteratorblock verwendet wird. Ein solcher Iterator muss eine Sammlung vom Typ IEnumerator oder IEnumerator<T> (oder einem abgeleiteten Typ) zurückgeben.
Vergleich von sofortiger Auswertung und verzögerter Auswertung
Wenn Sie eine Methode schreiben, die verzögerte Ausführung implementiert, müssen Sie auch entscheiden, ob die Methode mithilfe einer faulen Auswertung oder einer eifrigen Auswertung implementiert werden soll.
- Bei der faulen Auswertung wird während jedes Aufrufs des Iterators ein einzelnes Element der Quellauflistung verarbeitet. Dies ist die typische Art und Weise, in der Iteratoren implementiert werden.
- Bei der eifrigen Auswertung führt der erste Aufruf des Iterators dazu, dass die gesamte Sammlung verarbeitet wird. Möglicherweise ist auch eine temporäre Kopie der Quellauflistung erforderlich. Beispielsweise muss die OrderBy Methode die gesamte Auflistung sortieren, bevor sie das erste Element zurückgibt.
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. Für einige Vorgänge gibt es natürlich keine andere Möglichkeit als zwischengeschaltete Ergebnisse zu materialisieren.
Siehe Beispiel für verzögerte Ausführung für ein Beispiel zur Programmierung verzögerter Ausführung in C# und Visual Basic.