Poiché non sono stati forniti esempi, eccone uno che mi è stato utile.
Un enumeratore è un oggetto che si ottiene quando si chiama .GetEnumerator() su una classe o un tipo che implementa l'interfaccia IEnumerator. Quando viene implementata questa interfaccia, è stato creato tutto il codice necessario per il compilatore per consentire all'utente di utilizzare foreach
in "iterazione" sulla raccolta.
Non ottenere la parola "iterazione" confusa con l'iteratore: sia l'enumeratore che l'iteratore consentono di "iterare". Enumerare e iterare sono fondamentalmente lo stesso processo, ma sono implementati in modo diverso. impiantato l'interfaccia IEnumerator. Iterating significa che hai creato il costrutto iteratore nella tua classe (illustrato di seguito) e chiami foreach
sulla classe, momento in cui il compilatore crea automaticamente la funzionalità di enumerazione per te.
Nota anche che non devi fare lo squat con il tuo enumeratore. Puoi chiamare lo MyClass.GetEnumerator()
tutto il giorno e non fare nulla con esso (esempio:
IEnumerator myEnumeratorThatIWillDoNothingWith = MyClass.GetEnumerator()
).
Nota anche che il tuo costrutto iteratore nella tua classe viene solo realmente utilizzato quando lo stai effettivamente utilizzando, ovvero hai chiamato foreach
nella tua classe.
Ecco un esempio iteratore da msdn:
public class DaysOfTheWeek : System.Collections.IEnumerable
{
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
//This is the iterator!!!
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 - this is using the iterator!!! When the compiler
//detects your iterator, it will automatically generate the Current,
//MoveNext and Dispose methods of the IEnumerator or IEnumerator<T> interface
foreach (string day in week)
{
System.Console.Write(day + " ");
}
}
}
// Output: Sun Mon Tue Wed Thr Fri Sat
In C#, tuttavia, un iteratore è un costrutto specifico e speciale, nonché solo il verbo che descrive il termine. Un enumeratore, inoltre, è un'interfaccia specifica. I due hanno un significato nettamente diverso in C#, rispetto ai normali termini OO. –
Oh sì, hai ragione. Nei miei termini questo è tutto enumerato e ho completamente dimenticato che C# chiama questo pattern iteratore. –