Domanda

Dire che ho una classe che implementa IEnumerable<T>. E 'attualmente utilizza la parola chiave yield nel metodo GetEnumerator(). Ma ora ho bisogno di fare un po 'di più, per esempio vorrei pulire dopo me stesso. Per fare questo, a meno che non ho trascurato nulla, ho bisogno di implementare l'interfaccia IEnumerator<T>. Ma dove diresti dovrei farlo?

Se la classe stessa attuarlo e ritorno GetEnumerator() this? O sarebbe meglio nasconderlo in una classe privata? O dovrebbe forse essere solo una classe completamente diversa? Quali sono alcune pratiche comuni a questo?

È stato utile?

Soluzione

Se tutto quello che dovete fare è ripulire alcune risorse quando l'enumeratore viene smaltito, come alla fine di un ciclo foreach, allora si può fare con quello che hai, basta aggiungere un try / finally per il vostro iteratore metodo.

In questo modo:

public IEnumerator<T> GetEnumerator()
{
    try
    {
        // your iterator code here
    }
    finally
    {
        // cleanup code here
    }
}

Questo è tutto quello che c'è da fare.

Altri suggerimenti

Vorrei andare con una classe per l'IEnumerator . Questo dovrà memorizzare lo stato (posizione attuale), che non fa parte della collezione, ma piuttosto parte del processo di enumerazione.

Potrebbe non essere necessario scrivere classe per questo a tutti. Un metodo iteratore può restituire IEnumerable<T>, quindi, se la classe ha solo bisogno di implementare IEnumerable<T> e nient'altro, basta scrivere un metodo iteratore per il tutto.

In caso contrario, e si deve attaccare con una classe esterna che implementa IEnumerable<T> avendo un metodo iteratore per fare GetEnumerator, allora non c'è bisogno di fare nulla molto difficile da pulire dopo iterazione.

IEnumerator<T> deriva da IDisposable. Un metodo iteratore implementa Dispose eseguendo blocchi finally o qualsiasi codice dopo l'ultima yield return.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top