Qual è la differenza tra IEnumerator e IEnumerable?
La risposta di Jason è buona, ma ho pensato di aggiungere solo il modo in cui penso a questo. Immaginate di avere una sequenza:
1, 1, 2, 3, 5, 8, 13, ...
Ora immaginate di avere una freccia che punta in una qualche posizione di tale sequenza:
1, 1, 2, 3, 5, 8, 13, ...
^
Una "freccia" è un oggetto che può fare due cose. In primo luogo, può darti la cosa a cui punta. In secondo luogo, può fare riferimento alla prossima cosa.
IEnumerator è una freccia. Ha una proprietà, Current, che ti dà la cosa a cui punta. Ha un metodo, MoveNext() che si fa punto alla prossima cosa.
Come si ottiene una freccia in primo luogo? Hai bisogno di una fabbrica di frecce. Chiedete alla fabbrica una freccia e vi darà una freccia che punta al primo elemento della sequenza.
IEnumerable è una fabbrica di frecce. Ha un metodo, GetEnumerator, che ti dà una freccia per il primo elemento della sequenza.
Una bella proprietà di questo schema è che è possibile avere più frecce che puntano a punti diversi nella stessa sequenza.
quali sono i vantaggi dell'implementazione di un'interfaccia generica IEnumerable anziché solo IEnumerable?
Supponiamo che la sequenza sia di numeri interi. Se si implementa IEnumerable
poi quando dici
foreach(int x in mysequence)
ciò che realmente fare è convertire l'int nella sequenza di opporsi, boxe il numero intero, e poi Unbox immediatamente l'oggetto di nuovo al numero intero, l'aggiunta di un'allocazione di memoria completamente inutile ad ogni singola operazione. Se il compilatore sa che la sequenza è di interi, può saltare l'operazione di boxe non necessaria.
Supponiamo che la sequenza sia di stringhe. Se si implementa IEnumerable<string>
allora si può dire:
string first = mysequence.First();
Se non lo fai, allora dovete dire
string first = (string)mysequence.First();
che è inutile e soggetto a errori. Piuttosto che istruire il compilatore tramite un cast che il tipo è stringa, è possibile semplicemente garantire che il tipo sia stringa utilizzando il sistema di tipi.
Lascerò che John Skeet risponda a questo –
@Hasan: ho paura di quello che ti farà, scrivendo male il suo nome. – JYelton