Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le operazioni di query e asse vengono spesso implementate per usare l'esecuzione posticipata. Questo articolo illustra i requisiti e i vantaggi dell'esecuzione posticipata e alcune considerazioni sull'implementazione.
Esecuzione posticipata
L'esecuzione posticipata indica che la valutazione di un'espressione viene ritardata fino a quando non è effettivamente necessario il relativo valore realizzato . L'esecuzione posticipata può migliorare notevolmente le prestazioni quando è necessario modificare raccolte di dati di grandi dimensioni, in particolare nei programmi che contengono una serie di query o manipolazioni concatenati. Nel migliore dei casi, l'esecuzione posticipata abilita solo una singola iterazione tramite la raccolta di origine.
Le tecnologie LINQ usano ampiamente l'esecuzione posticipata sia nei membri delle classi principali System.Linq che nei metodi di estensione nei vari spazi dei nomi LINQ, ad esempio System.Xml.Linq.Extensions.
L'esecuzione posticipata è supportata direttamente nel linguaggio C# dalla parola chiave yield (Riferimenti C#) (sotto forma di istruzione ) quando viene usata all'interno di yield-return
un blocco iteratore. Tale iteratore deve restituire una raccolta di tipo IEnumerator o IEnumerator<T> (o un tipo derivato).
Valutazione anticipata e ritardata
Quando si scrive un metodo che implementa l'esecuzione posticipata, è anche necessario decidere se implementare il metodo usando la valutazione differita o la valutazione immediata.
- Nella valutazione differita, un singolo elemento della raccolta di origine viene elaborato durante ogni chiamata all'iteratore. Questo è il modo tipico in cui vengono implementati gli iteratori.
- Nella valutazione anticipata, la prima chiamata all'iteratore darà luogo all'elaborazione dell'intera raccolta. Potrebbe essere necessaria anche una copia temporanea della raccolta di origine. Ad esempio, il OrderBy metodo deve ordinare l'intera raccolta prima di restituire il primo elemento.
La valutazione differita produce in genere prestazioni migliori perché distribuisce il carico computazionale in modo uniforme durante la valutazione della collezione e riduce al minimo l'uso dei dati temporanei. Naturalmente, per alcune operazioni, non c'è altra opzione che materializzare i risultati intermedi.
Vedere Esempio di esecuzione posticipata per un esempio di esecuzione posticipata di programmazione in C# e Visual Basic.