Esecuzione posticipata e valutazione differita in LINQ to XML
Operazioni di query e su asse vengono spesso implementate in modo da usare l'esecuzione posticipata. In questo articolo vengono illustrati requisiti e vantaggi dell'esecuzione posticipata e vengono fornite alcune considerazioni sull'implementazione.
Esecuzione posticipata
Per esecuzione posticipata si intende che la valutazione di un'espressione viene ritardata finché il relativo valore realizzato non risulta effettivamente necessario. L'esecuzione posticipata può contribuire a migliorare notevolmente le prestazioni quando è necessario modificare grandi raccolte di dati, in particolare in programmi che contengono una serie di modifiche o query concatenate. Nel migliore dei casi l'esecuzione posticipata consente di eseguire un'unica iterazione nella raccolta di origine.
Le tecnologie LINQ usano notevolmente l'esecuzione posticipata sia nei membri di classi System.Linq principali che nei metodi di estensione dei diversi spazi dei nomi LINQ, ad esempio System.Xml.Linq.Extensions.
L'esecuzione posticipata è supportata direttamente nel linguaggio C# dalla parola chiave yield (riferimento C#) (sotto forma di istruzione yield-return
) quando viene usata all'interno di un blocco iteratore. Tale iteratore deve restituire una raccolta di tipo IEnumerator o IEnumerator<T> (o un tipo derivato).
Valutazione eager e valutazione differita
Quando si scrive un metodo che implementa l'esecuzione posticipata, è inoltre necessario decidere se implementare il metodo tramite la valutazione lazy o la valutazione eager.
- Nella valutazione lazy durante ogni chiamata all'iteratore viene elaborato un unico elemento della raccolta di origine. Si tratta della modalità di implementazione tipica degli iteratori.
- Nella valutazione eager in seguito alla prima chiamata all'iteratore verrà elaborata l'intera raccolta. Potrebbe inoltre essere necessaria una copia temporanea della raccolta di origine. Ad esempio, il metodo OrderBy deve ordinare l'intera raccolta prima di restituire il primo elemento.
La valutazione lazy offre in genere prestazioni migliori perché implica una distribuzione uniforme dell'overhead di elaborazione in tutte le fasi della valutazione della raccolta e riduce al minimo l'uso di dati temporanei. Per alcune operazioni è naturalmente inevitabile dover materializzare i risultati intermedi.
Vedere Esempio di esecuzione posticipata per un esempio di esecuzione posticipata di programmazione in C# e Visual Basic.