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?

War es hilfreich?

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 gehen. Dies muss zu speichern Zustand (aktuelle Position), die nicht Teil der Sammlung ist, sondern ein Teil des Prozesses aufzuzählen.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top