Odroczone wykonywanie i opóźniona ocena (LINQ to XML)

Operacje zapytań i osi są często implementowane w celu korzystania z wykonania odroczonego. W tym artykule wyjaśniono wymagania i zalety odroczonego wykonywania oraz niektóre zagadnienia dotyczące implementacji.

Odroczone wykonanie

Odroczone wykonanie oznacza, że ocena wyrażenia jest opóźniona, dopóki nie zostanie rzeczywiście wymagana jego zrealizowana wartość. Odroczone wykonywanie może znacznie poprawić wydajność, gdy trzeba manipulować dużymi kolekcjami danych, zwłaszcza w programach zawierających serię zapytań łańcuchowych lub manipulacji. W najlepszym przypadku odroczone wykonanie umożliwia tylko pojedynczą iterację za pośrednictwem kolekcji źródłowej.

Technologie LINQ wykorzystują szeroko zakrojone wykonywanie odroczone zarówno w składowych klas podstawowych System.Linq , jak i w metodach rozszerzeń w różnych przestrzeniach nazw LINQ, takich jak System.Xml.Linq.Extensions.

Wykonywanie odroczone jest obsługiwane bezpośrednio w języku C# przez słowo kluczowe yield (odwołanie w C#) (w postaci yield-return instrukcji) w przypadku użycia w bloku iteratora. Taki iterator musi zwrócić kolekcję typu IEnumerator lub IEnumerator<T> (lub typu pochodnego).

Chętna a leniwa ocena

Podczas pisania metody, która implementuje odroczone wykonanie, musisz również zdecydować, czy wdrożyć metodę przy użyciu leniwej oceny, czy oceny chętnej.

  • W przypadku leniwej oceny pojedynczy element kolekcji źródłowej jest przetwarzany podczas każdego wywołania iteratora. Jest to typowy sposób implementacji iteratorów.
  • W celu wyczekiwanej oceny pierwsze wywołanie iteratora spowoduje przetworzenie całej kolekcji. Może być również wymagana tymczasowa kopia kolekcji źródłowej. Na przykład OrderBy metoda musi posortować całą kolekcję, zanim zwróci pierwszy element.

Ocena leniwa zwykle daje lepszą wydajność, ponieważ dystrybuuje przetwarzanie narzutowe równomiernie w trakcie oceny kolekcji i minimalizuje użycie danych tymczasowych. Oczywiście w przypadku niektórych operacji nie ma innej opcji niż materializowanie wyników pośrednich.

Zobacz Przykład odroczonego wykonywania, aby zapoznać się z przykładem odroczonego wykonywania programowania w językach C# i Visual Basic.

Zobacz też