C #: Dove implementare un costume IEnumerator
-
19-09-2019 - |
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?
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
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
.