Iteratori (Guida per programmatori C#)
Un iteratore è un metodo, una funzione di accesso get o un operatore che esegue un'iterazione personalizzata su una matrice o una classe di insiemi utilizzando la parola chiave yield. L'istruzione yield return fa in modo che venga restituito immediatamente un elemento nella sequenza di origine al chiamante prima dell'accesso al successivo elemento nella sequenza di origine. Sebbene un iteratore venga scritto come metodo, il compilatore lo converte in una classe annidata che, in pratica, è una macchina a stati. Questa classe tiene traccia della posizione dell'iteratore purché il ciclo foreach nel codice client sia continuo.
Nota
Per verificare le operazioni eseguite automaticamente dal compilatore, utilizzare lo strumento ILDASM.exe per visualizzare il codice Microsoft Intermediate Language (IL) generato per un metodo dell'iteratore.
Un iteratore viene richiamato da codice client utilizzando l'istruzione foreach. È possibile ad esempio creare un iteratore per una classe che restituisce gli elementi in ordine inverso o che esegue un'operazione su ogni elemento prima che venga restituito dall'iteratore. Quando si crea un iteratore per la classe o la struttura, non è necessario implementare l'intera interfaccia IEnumerator. Quando il compilatore rileva l'iteratore, genererà automaticamente i metodi Current, MoveNext e Dispose dell'interfaccia IEnumerator o IEnumerator<T>.
Cenni preliminari sugli iteratori
Un iteratore è una sezione di codice che restituisce una sequenza ordinata di valori dello stesso tipo.
Un iteratore può essere utilizzato come corpo di un metodo, un operatore o una funzione di accesso get.
Il codice iteratore utilizza l'istruzione yield return per restituire di volta in volta i singoli elementi. yield break termina l'iterazione.
In una classe è possibile implementare più iteratori. Ciascuno di essi deve avere un nome univoco, analogamente a qualsiasi membro di classe, e può essere richiamato dal codice client in un'istruzione foreach, come segue: foreach(int x in SampleClass.Iterator2){}.
Il tipo restituito di un iteratore deve essere IEnumerable, IEnumerator, IEnumerable<T> o IEnumerator<T>.
Gli iteratori rappresentano la base del comportamento per l'esecuzione posticipata nelle query LINQ.
La parola chiave yield viene utilizzata per specificare il valore o i valori restituiti. Quando viene raggiunta l'istruzione yield return, la posizione corrente viene archiviata. Alla successiva chiamata dell'iteratore, l'esecuzione verrà riavviata a partire da questa posizione.
Gli iteratori sono particolarmente utili con le classi di insiemi, in quanto rappresentano un modo semplice per scorrere strutture dati complesse, quali le strutture ad albero binarie.
Sezioni correlate
Per ulteriori informazioni:
Procedura: creare un blocco iteratore per un elenco di valori integer (Guida per programmatori C#)
Procedura: creare un blocco iteratore per un elenco generico (Guida per programmatori C#)
Esempio
Nell'esempio seguente la classe DaysOfTheWeek è una classe di insiemi semplice che archivia i giorni della settimana come stringhe. Dopo ogni iterazione di un ciclo foreach, viene restituita la stringa successiva dell'insieme.
public class DaysOfTheWeek : System.Collections.IEnumerable
{
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < days.Length; i++)
{
yield return days[i];
}
}
}
class TestDaysOfTheWeek
{
static void Main()
{
// Create an instance of the collection class
DaysOfTheWeek week = new DaysOfTheWeek();
// Iterate with foreach
foreach (string day in week)
{
System.Console.Write(day + " ");
}
}
}
// Output: Sun Mon Tue Wed Thr Fri Sat
Specifiche del linguaggio C#
Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.
Vedere anche
Riferimenti
Generics (Guida per programmatori C#)