¿Cuál es la diferencia entre IEnumerator e IEnumerable?
La respuesta de Jason es buena, pero pensé que solo agregaría cómo pienso sobre esto. Imagine que tiene una secuencia:
1, 1, 2, 3, 5, 8, 13, ...
Ahora imagine que tiene una flecha que apunta en alguna posición de esa secuencia:
1, 1, 2, 3, 5, 8, 13, ...
^
"una flecha" es un objeto que puede hacer dos cosas. Primero, puede darle lo que está apuntando. En segundo lugar, puede señalarse a sí mismo en lo siguiente.
IEnumerator es una flecha. Tiene una propiedad, Actual, que le proporciona aquello a lo que apunta. Tiene un método, MoveNext() que hace que apunte a lo siguiente.
¿Cómo se obtiene una flecha en primer lugar? Necesitas una fábrica de flechas Le pides a la fábrica una flecha, y te da una flecha que apunta al primer elemento de la secuencia.
IEnumerable es una fábrica de flechas. Tiene un método, GetEnumerator, que le da una flecha al primer elemento de la secuencia.
Una propiedad agradable de este esquema es que puede tener varias flechas apuntando a diferentes lugares en la misma secuencia.
¿Cuáles son los beneficios de implementar la interfaz genérica IEnumerable en lugar de solo IEnumerable?
Supongamos que la secuencia es de números enteros. Si implementa IEnumerable
entonces cuando se dice
foreach(int x in mysequence)
lo que realmente va a hacer es convertir el int en la secuencia de oponerse, boxeo del número entero, y luego unbox inmediatamente el objeto de nuevo al número entero, añadiendo una asignación de memoria completamente innecesario a cada operación individual. Si el compilador sabe que la secuencia es de números enteros, puede omitir la operación de boxeo innecesaria.
Supongamos que la secuencia es de cadenas. Si implementa IEnumerable<string>
entonces se puede decir:
string first = mysequence.First();
Si no lo hace, entonces usted tiene que decir
string first = (string)mysequence.First();
que es innecesario y propenso a errores. En lugar de indicarle al compilador a través de un molde que el tipo es una cadena, simplemente puede garantizar que el tipo es cadena utilizando el sistema de tipo.
Dejaré que john skeet responda esto –
@Hasan: Temo lo que él te hará al escribir mal su nombre. – JYelton