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?

¿Fue útil?

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 . Esto tendrá que almacenar el estado (posición actual) que no forma parte de la colección, sino más bien parte del proceso de enumerar.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top