Esecuzione posticipata e valutazione lazy in LINQ to XML
Operazioni di query e su asse vengono spesso implementate in modo da utilizzare l'esecuzione posticipata. In questo argomento 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 utilizzano 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# tramite la parola chiave yield (sotto forma di istruzione yield-return) quando viene utilizzata all'interno di un blocco iteratore. Tale iteratore deve restituire una raccolta di tipo IEnumerator o IEnumerator<T> (o un tipo derivato). Non esiste controparte della parola chiave yield in Visual Basic 9.0, pertanto l'implementazione dell'esecuzione posticipata in questo linguaggio è più complessa.
Valutazione eager evalutazione lazy
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'utilizzo di dati temporanei. Per alcune operazioni è naturalmente inevitabile dover materializzare i risultati intermedi.
Passaggi successivi
Nel successivo argomento dell'esercitazione verrà illustrata l'esecuzione posticipata:
Vedere anche
Riferimenti
Concetti
Esercitazione: concatenamento di query