IEnumerator<(Of <(T>)>) est l'interface de base pour tous les énumérateurs génériques.
L'instruction foreach du langage C# (for each en 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. À cette position, Current n'est pas défini. Par conséquent, vous devez appeler 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 jusqu'à ce que MoveNext soit appelé. MoveNext affecte Current à l'élément suivant.
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, Current n'est pas défini. Vous ne pouvez pas affecter de nouveau à Current le premier élément de la collection ; créez à la place une nouvelle instance de l'énumérateur.
La méthode Reset est fournie pour l'interopérabilité COM. Elle ne doit pas nécessairement être implémentée ; au lieu de cela, l'implémenteur peut simplement lever un NotSupportedException.
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 son comportement n'est pas défini.
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. Pour garantir la sécurité des threads pendant l'énumération, vous pouvez verrouiller la collection pendant toute la durée de cette opération. Pour permettre à plusieurs threads d'accéder en lecture et en écriture à la collection, vous devez implémenter votre propre synchronisation.
Les implémentations par défaut de collections dans l'espace de noms System.Collections.Generic ne sont pas synchronisées.
Remarques à l'attention des implémenteurs : L'implémentation de cette interface requiert l'implémentation de l'interface IEnumerator non générique. Les méthodes MoveNext et Reset ne dépendent pas de T et apparaissent uniquement sur l'interface non générique. La propriété Current apparaît sur les deux interfaces et présente différents types de retour. Implémentez la propriété IEnumerator..::.Current non générique comme une implémentation d'interface explicite. Cela permet à tout consommateur de l'interface non générique d'utiliser l'interface générique.