C #: ¿Dónde poner en práctica una costumbre IEnumerator
-
19-09-2019 - |
Pregunta
Decir que tengo una clase que implementa IEnumerable<T>
. Actualmente utiliza la palabra clave en el método yield
GetEnumerator()
. Pero ahora tengo que hacer un poco más, por ejemplo, me gustaría que limpiar después de mí. Para ello, a menos que haya pasado por alto nada, necesito implementar la interfaz IEnumerator<T>
. Pero, ¿dónde diría usted que debería hacer eso?
En caso de que la propia clase implementarlo y el retorno GetEnumerator()
this
? ¿O sería mejor para ocultarlo en una clase privada? O en caso de que tal vez sólo sea una clase completamente diferente? ¿Cuáles son algunas de las prácticas comunes a esto?
Solución
Si todo lo que necesita hacer es limpiar algunos recursos cuando el encuestador se elimina, al igual que al final de un bucle foreach
, entonces usted puede hacer eso con lo que tienes, sólo tiene que añadir un try / bloque finally a su iterador método.
De esta manera:
public IEnumerator<T> GetEnumerator()
{
try
{
// your iterator code here
}
finally
{
// cleanup code here
}
}
Eso es todo lo que hay que hacer.
Otros consejos
Me gustaría ir con una clase para el IEnumerator
Es posible que no tenga que escribir la clase para esto en absoluto. Un método iterador puede volver IEnumerable<T>
, así que si su clase solo necesita implementar IEnumerable<T>
y nada más, acaba de escribir un método iterador de todo el asunto.
Si no es así, y usted tiene que pegarse con una clase externa que implementa IEnumerable<T>
por tener un método iterador que hacer GetEnumerator
, entonces usted no tiene que hacer nada muy difícil de limpiar después de iteración.
IEnumerator<T>
deriva de IDisposable
. Un método iterador implementa Dispose
mediante la ejecución de bloques finally
o cualquier código después de la última yield return
.