C #: Wo eine benutzerdefinierte implementieren IEnumerator
-
19-09-2019 - |
Frage
sagen, ich habe eine Klasse, die implementiert IEnumerable<T>
. Es nutzt derzeit die yield
im GetEnumerator()
Verfahren Schlüsselwort. Aber jetzt brauche ich ein bisschen mehr zu tun, zum Beispiel würde Ich mag mich selbst aufzuräumen. Um dies zu tun, es sei denn ich etwas übersehen haben, muss ich die IEnumerator<T>
Schnittstelle implementieren. Aber wo würden Sie sagen, ich soll das tun?
Sollte die Klasse selbst es und GetEnumerator()
Rückkehr this
implementieren? Oder wäre es besser, es in einem privaten Klasse zu verbergen? Oder sollte es vielleicht auch nur eine ganz andere Klasse sein? Was sind einige gemeinsame Praktiken das?
Lösung
Wenn alles, was Sie tun müssen, um auf einige Ressourcen sauber ist, wenn der Enumerator angeordnet ist, wie am Ende eines foreach
Schleife, dann können Sie das tun, mit dem, was Sie haben, nur einen Versuch hinzufügen / finally auf Ihre Iteratorblock Verfahren.
Wie folgt aus:
public IEnumerator<T> GetEnumerator()
{
try
{
// your iterator code here
}
finally
{
// cleanup code here
}
}
Das ist alles, was es ist.
Andere Tipps
würde ich mit einer Klasse für den IEnumerator
Sie können nicht für diese überhaupt zu schreiben Klasse benötigen. Ein Iteratormethode IEnumerable<T>
zurückkehren kann, so dass, wenn Ihre Klasse braucht nur IEnumerable<T>
und nichts anderes zu implementieren, nur ein Iteratormethode für die ganze Sache schreiben.
Wenn nicht, und Sie müssen Stick mit einer äußeren Klasse, die implementiert IEnumerable<T>
durch eine Iteratormethode mit GetEnumerator
zu tun, dann haben Sie nichts sehr schwierig zu tun, nachdem Iteration aufzuräumen.
IEnumerator<T>
ergibt sich aus IDisposable
. Eine Iterator Methode implementiert Dispose
durch finally
Blöcke oder beliebigen Code nach dem letzten yield return
ausführt.