martes, noviembre 28, 2006

IEnumerator (Interfaz)

IEnumerator es la interfaz base para todos los enumeradores no genéricos.

Para obtener la versión genérica de esta interfaz, vea IEnumerator.

La instrucción foreach del lenguaje C# (for each en Visual Basic) oculta la complejidad de los enumeradores. Por tanto, se recomienda el uso de foreach en lugar de manipular directamente el enumerador.

Los enumeradores se pueden utilizar para leer los datos de la colección, pero no para modificar la colección subyacente.

Inicialmente, el enumerador se coloca delante del primer elemento de la colección. El método Reset también devuelve el enumerador a esta posición. En esta posición, una llamada a la propiedad Current produce una excepción. Por lo tanto, se debe llamar al método MoveNext para desplazar el enumerador hasta el primer elemento de la colección antes de leer el valor de Current.

Current devuelve el mismo objeto hasta que se llama a MoveNext o a Reset. MoveNext establece el valor de Current en el siguiente elemento.

Si MoveNext pasa el final de la colección, el enumerador se coloca detrás del último elemento de la colección y MoveNext devuelve el valor false. Cuando el enumerador está en esta posición, las llamadas posteriores al método MoveNext también devuelven el valor false. Si la última llamada al método MoveNext ha devuelto false y se realiza una llamada a la propiedad Current, se produce una excepción. Para volver a establecer el valor de Current en el primer elemento de la colección, se puede llamar primero al método Reset y después al método MoveNext.

Mientras no se modifique la colección, el enumerador continúa siendo válido. Si se realizan cambios en la colección, como agregar, modificar o eliminar elementos, el enumerador se invalida definitivamente y la siguiente llamada a MoveNext o a Reset produce una excepción InvalidOperationException. Si la colección se modifica entre MoveNext y Current, Current devuelve el elemento en el que está establecido, aunque el enumerador ya haya quedado invalidado.

El enumerador no tiene acceso exclusivo a la colección; por lo tanto, la enumeración a través de una colección es un procedimiento que, en esencia, no es seguro para la ejecución de subprocesos. Aunque una colección esté sincronizada, otros subprocesos pueden seguir modificándola, por lo que el enumerador produce una excepción. Con el fin de garantizar la seguridad para la ejecución de subprocesos durante la enumeración, se puede bloquear la colección durante toda la enumeración o detectar las excepciones debidas a cambios efectuados por otros subprocesos.

No hay comentarios.: