IEnumerable bietet zwei GetEnumerator Methoden - was ist der Unterschied zwischen ihnen?
-
05-09-2019 - |
Frage
Wenn ich emplement IEnumerable<T>
Schnittstelle I zwei GetEnumerator
Methoden sehen: eine Rückkehr IEnumerator
und andere IEnumerator<T>
. Wann würde ich den einen oder anderen verwenden?
Lösung
Wenn Sie die IEnumerable<T>
generische Schnittstelle implementieren, werden Sie ziemlich immer die generische Methode GetEnumerator verwenden -., Wenn Sie Ihr Objekt geworfen explizit auf (nicht-generic) IEnumerable
Der Grund dafür ist rückwärts Kompatibilität mit .NET 1.0 / 1.1, die Generika nicht unterstützen.
Andere Tipps
Sie in der Regel beide implementieren. Eine davon ist die neuere, generische Version, die eine typsichere Enumerator zurück (IEnumerator<T>
). Der andere ist für die Kompatibilität mit Legacy-Code (kehrt IEnumerator
). Eine typische Implementierung ist:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
Der Grund gibt es zwei Methoden, weil IEnumerable<T>
die IEnumerable
Schnittstelle erbt, so dass Sie die generische Methode von IEnumerable<T>
sehen und die nicht-generische Methode von IEnumerable
.
Hier ist, wie Sie die Schnittstelle in Ihrer Art implementieren möchten:
class Foo : IEnumerable<Foo>
{
public IEnumerator<Foo> GetEnumerator()
{
// do your thing here
}
// do a EIMI here and simply call the generic method
IEnumerator IEnumerable.GetEnumerator()
{
this.GetEnumerator();
}
}
In der Regel GetEnumerator()
ruft GetEnumerator<T>()
, so sollte es nicht viel Unterschied im Verhalten sein. Was, warum zwei Methoden gibt, ist dies für die Abwärtskompatibilität getan und für den Einsatz in Situation, wo T
nicht von großen Interesse ist (oder gerade unbekannt).
Das ist generisch, die andere nicht. Ich glaube, dass der Compiler bevorzugt die allgemeine Überlastung zu verwenden.