IEnumerator est l'interface de base pour tous les énumérateurs non génériques.
Pour la version générique de cette interface, consultez IEnumerator<(Of <(T>)>).
L'instruction foreach du langage C# (for each en Visual Basic) cache la complexité des énumérateurs. Il est donc recommandé d'utiliser foreach plutôt que de manipuler l'énumérateur directement.
Les énumérateurs peuvent être utilisés pour lire les données d'une collection, mais ils ne permettent pas de modifier la collection sous-jacente.
L'énumérateur est initialement positionné avant le premier élément de la collection. La méthode Reset ramène aussi l'énumérateur à cette position. À cette position, un appel à la propriété Current lève une exception. Par conséquent, vous devez appeler la méthode MoveNext pour avancer l'énumérateur au premier élément de la collection avant la lecture de la valeur de Current.
Current retourne le même objet tant que MoveNext ou Reset n'est pas appelé. MoveNext affecte l'élément suivant à Current.
Si MoveNext passe la fin de la collection, l'énumérateur est placé après le dernier élément de la collection et MoveNext retourne false. Lorsque l'énumérateur est à cette position, les appels suivants à MoveNext retournent également false. Si le dernier appel à MoveNext a retourné false, l'appel à Current lève une exception. Pour affecter à nouveau le premier élément de la collection comme valeur de Current, vous pouvez appeler Reset, puis MoveNext.
Un énumérateur reste valide aussi longtemps que la collection demeure inchangée. Si la collection est modifiée en ajoutant, modifiant ou supprimant des éléments, l'énumérateur devient irrévocablement non valide et le prochain appel à MoveNext ou à Reset lève InvalidOperationException. Si la collection est modifiée entre MoveNext et Current, Current retourne l'élément défini comme sa valeur, même si l'énumérateur est déjà non valide.
L'énumérateur ne dispose pas d'un accès exclusif à la collection. Par conséquent, l'énumération d'une collection n'est intrinsèquement pas une procédure thread-safe. Même lorsqu'une collection est synchronisée, les autres threads peuvent toujours modifier la collection, ce qui entraîne la levée d'une exception par l'énumérateur. Afin de garantir la sécurité des threads au cours de l'énumération, vous pouvez soit verrouiller la collection pendant l'ensemble de l'énumération, soit intercepter les exceptions résultant des modifications apportées par les autres threads.