For Each...Next |
Pour chaque prochain |
---|---|
Visual Basic .NET (VB .NET) |
Syntaxe
For Each element [ As datatype ] In group [ statements ] [ Continue For ] [ statements ] [ Exit For ] [ statements ] Next [ element ] |
Paramètres
Nom | Description |
---|---|
element | Ce paramètre permet d'indiquer les éléments de la collection à parcourir. Le paramètre element est obligatoire dans l'instruction For Each mais facultatif dans l'instruction Next. |
datatype | Ce paramètre permet d'indiquer le type de données. Si Option Infer est activé (valeur par défaut) ou si l'élément est déjà déclaré ; requis si Option Infer est désactivé et que l'élément n'est pas déjà déclaré. Le type de données de l'élément. |
group | Ce paramètre obligatoire permet d'indiquer une variable avec un type étant un type de collection ou un objet. Fait référence à la collection sur laquelle les déclarations doivent être répétées. |
statements | Ce paramètre permet d'indiquer une ou plusieurs instructions entre For Each et Next s'exécutant sur chaque élément du groupe. |
Continue For | Ce paramètre permet de transférer le contrôle au début de la boucle For Each. |
Exit For | Ce paramètre permet de transférer le contrôle hors de la boucle For Each. |
Next | Ce paramètre obligatoire permet d'indiquer la terminaison de la définition de la boucle For Each. |
Description
Ce mot réservé permet de répéter un groupe d'instructions pour chaque élément d'une collection.
Remarques
- Utilisez une boucle For Each...Next lorsque vous souhaitez répéter un ensemble d'instructions pour chaque élément d'une collection ou d'un tableau.
- Une instruction For...Next fonctionne bien lorsque vous pouvez associer chaque itération d'une boucle à une variable de contrôle et déterminer les valeurs initiale et finale de cette variable. Cependant, lorsqu'il s'agit d'une collection, la notion de valeurs initiales et finales n'a pas de sens, et vous ne savez pas forcément combien d'éléments la collection contient. Dans ce genre de cas, une boucle For Each...Next est souvent un meilleur choix.
- Boucles imbriquées : Vous pouvez imbriquer des boucles For Each en insérant une boucle dans une autre. Lorsque vous imbriquez des boucles, chaque boucle doit avoir une variable d'élément unique. Vous pouvez également imbriquer différents types de structures de contrôle les unes dans les autres.
- Exit For et Continue For : L'instruction Exit For provoque la sortie de l'exécution de la boucle For...Next et transfère le contrôle à l'instruction suivant l'instruction Next. L'instruction Continue For transfère immédiatement le contrôle à l'itération suivante de la boucle.
- Vous pouvez mettre n'importe quel nombre d'instructions Exit For dans une boucle For Each. Lorsqu'il est utilisé dans des boucles For Each imbriquées, Exit For fait sortir l'exécution de la boucle la plus interne et transfère le contrôle au niveau d'imbrication immédiatement supérieur. Le Exit For est souvent utilisé après une évaluation de certaines conditions, par exemple, dans une structure If...Then...Else. Vous pouvez utiliser Exit For pour les conditions suivantes : continuer à itérer est inutile ou impossible (cela peut être dû à une valeur erronée ou à une demande de résiliation), une exception est interceptée dans un Try...Catch...Finally (vous pouvez utiliser Exit For à la fin du bloc Final), il y a une boucle sans fin, étant une boucle pouvant s'exécuter un nombre important voire infini de fois. Si vous détectez une telle condition, vous pouvez utiliser Exit For pour échapper à la boucle.
- Itérateurs : Vous utilisez un itérateur pour effectuer une itération personnalisée sur une collection. Un itérateur peut être une fonction ou un accesseur Get. Il utilise une instruction Yield pour renvoyer chaque élément de la collection un à la fois. Vous appelez un itérateur à l'aide d'une instruction For Each...Next. Chaque itération de la boucle For Each appelle l'itérateur. Lorsqu'une instruction Yield est atteinte dans l'itérateur, l'expression de l'instruction Yield est renvoyée et l'emplacement actuel dans le code est conservé. L'exécution est redémarrée à partir de cet emplacement la prochaine fois que l'itérateur est appelé. L'exemple suivant utilise une fonction d'itération. La fonction itérateur a une instruction Yield se trouvant à l'intérieur d'une boucle For...Next. Dans la méthode ListEvenNumbers, chaque itération du corps de l'instruction For Each crée un appel à la fonction d'itération, passant à l'instruction Yield suivante.
- Mise en oeuvre technique : Lorsqu'une instruction For Each...Next s'exécute, le Visual Basic .NET n'évalue la collection qu'une seule fois, avant le démarrage de la boucle. Si votre bloc d'instructions change d'élément ou de groupe, ces changements n'affectent pas l'itération de la boucle. Lorsque tous les éléments de la collection ont été successivement affectés à l'élément, la boucle For Each s'arrête et le contrôle passe à l'instruction suivant l'instruction Next. Si Option Infer est activé (son paramètre par défaut), le compilateur Visual Basic .NET peut déduire le type de données de l'élément. S'il est désactivé et que l'élément n'a pas été déclaré en dehors de la boucle, vous devez le déclarer dans l'instruction For Each. Pour déclarer explicitement le type de données de l'élément, utilisez une clause As. À moins que le type de données de l'élément ne soit défini en dehors de la construction For Each...Next, sa portée est le corps de la boucle. Notez que vous ne pouvez pas déclarer l'élément à la fois à l'extérieur et à l'intérieur de la boucle. Vous pouvez éventuellement spécifier l'élément dans l'instruction Next. Cela améliore la lisibilité de votre programme, surtout si vous avez imbriqué des boucles For Each. Vous devez spécifier la même variable que celle apparaissant dans l'instruction For Each correspondante. Vous voudrez peut-être éviter de modifier la valeur de l'élément à l'intérieur d'une boucle. Cela peut rendre plus difficile la lecture et le débogage de votre code. La modification de la valeur de group n'affecte pas la collection ou ses éléments, ayant été déterminés lors de la première entrée dans la boucle. Lorsque vous imbriquez des boucles, si une instruction Next d'un niveau d'imbrication externe est rencontrée avant la Next d'un niveau interne, le compilateur signale une erreur. Cependant, le compilateur ne peut détecter cette erreur de chevauchement que si vous spécifiez element dans chaque instruction Next. Si votre code dépend du parcours d'une collection dans un ordre particulier, une boucle For Each...Next n'est pas le meilleur choix, à moins que vous ne connaissiez les caractéristiques de l'objet énumérateur exposé par la collection. L'ordre de parcours n'est pas déterminé par Visual Basic .NET, mais par la méthode MoveNext de l'objet énumérateur. Par conséquent, vous ne pourrez peut-être pas prédire quel élément de la collection est le premier à être renvoyé dans element, ou quel est le prochain à être renvoyé après un élément donné. Vous pouvez obtenir des résultats plus fiables en utilisant une structure de boucle différente, telle que For...Next ou Do...Loop. Le code d'exécution doit pouvoir convertir les éléments du groupe en élément. L'instruction [Option Strict] contrôle si les conversions élargies et restrictives sont autorisées (Option Strict est désactivée, sa valeur par défaut) ou si seules les conversions élargies sont autorisées (Option Strict est activée). Le type de données de group doit être un type référence faisant référence à une collection ou à un tableau énumérable. Le plus souvent, cela signifie que groupe fait référence à un objet mettant en oeuvre l'interface IEnumerable de l'espace de noms System.Collections ou l'interface IEnumerable<T> de l'espace de noms System.Collections.Generic. Le System.Collections.IEnumerable définit la méthode GetEnumerator, renvoyant un objet énumérateur pour la collection. L'objet énumérateur implémente l'interface System.Collections.IEnumerator de l'espace de noms System.Collections et expose la propriété Current et les méthodes Reset et MoveNext. Le Visual Basic .NET les utilise pour parcourir la collection.
- Réduire les conversions : Lorsque Option Strict est défini sur On, les conversions restreintes provoquent généralement des erreurs de compilation. Dans une instruction For Each, cependant, les conversions des éléments du groupe en élément sont évaluées et exécutées au moment de l'exécution, et les erreurs du compilateur causées par le rétrécissement des conversions sont supprimées.
- Appels IEnumerator : Lorsque l'exécution d'une boucle For Each...Next démarre, le Visual Basic .NET vérifie que le groupe fait référence à un objet de collection valide. Sinon, il lève une exception. Sinon, il appelle la méthode MoveNext et la propriété Current de l'objet énumérateur pour renvoyer le premier élément. Si MoveNext indique qu'il n'y a pas d'élément suivant, c'est-à-dire si la collection est vide, la boucle For Each s'arrête et le contrôle passe à l'instruction suivant l'instruction Next. Sinon, Visual Basic .NET définit element sur le premier élément et exécute le bloc d'instructions. Chaque fois que Visual Basic .NET rencontre l'instruction Next, il revient à l'instruction For Each. Encore une fois, il appelle MoveNext et Current pour renvoyer l'élément suivant, et encore une fois, il exécute le bloc ou arrête la boucle en fonction du résultat. Ce processus se poursuit jusqu'à ce que MoveNext indique qu'il n'y a pas d'élément suivant ou qu'une instruction Exit For est rencontrée.
- Modification de la collection : L'objet énumérateur renvoyé par GetEnumerator ne vous permet normalement pas de modifier la collection en ajoutant, supprimant, remplaçant ou réorganisant des éléments. Si vous modifiez la collection après avoir lancé une boucle For Each...Next, l'objet énumérateur devient non valide et la prochaine tentative d'accès à un élément provoque une exception InvalidOperationException.
- Cependant, ce blocage de modification n'est pas déterminé par Visual Basic .NET, mais plutôt par l'implémentation de l'interface IEnumerable. Il est possible de mettre en oeuvre IEnumerable d'une manière permettant la modification pendant l'itération. Si vous envisagez d'effectuer une telle modification dynamique, assurez-vous que vous comprenez les caractéristiques de l'implémentation IEnumerable sur la collection que vous utilisez.
- Modification des éléments de qualité. La propriété Current de l'objet énumérateur est ReadOnly et elle renvoie une copie locale de chaque élément de collection. Cela signifie que vous ne pouvez pas modifier les éléments eux-mêmes dans une boucle For Each...Next. Toute modification que vous apportez affecte uniquement la copie locale de Current et n'est pas reflétée dans la collection sous-jacente. Cependant, si un élément est de type référence, vous pouvez modifier les membres de l'instance vers laquelle il pointe. L'exemple suivant modifie le membre BackColor de chaque élément thisControl. Vous ne pouvez cependant pas modifier thisControl lui-même.
- Traverser les tableaux : Étant donné que la classe Array implémente l'interface IEnumerable, tous les tableaux exposent la méthode GetEnumerator. Cela signifie que vous pouvez parcourir un tableau avec une boucle For Each...Next. Cependant, vous ne pouvez lire que les éléments du tableau. Vous ne pouvez pas les changer.
Dernière mise à jour : Mardi, le 24 Août 2021