Récemment, je traversais un projet open-source et bien que je développe depuis plusieurs années sous .NET, je n’étais jamais tombé par hasard sur le mot clécontinue
avant.
Question: Quelles sont les meilleures pratiques ou domaines dans lesquels l'utilisation du mot clé continue
serait bénéfique? Y a-t-il une raison pour laquelle je ne l'aurais peut-être pas vu auparavant?
Vous l'utilisez pour quitter immédiatement l'itération de la boucle en cours et commencer la prochaine, le cas échéant.
foreach (var obj in list)
{
continue;
var temp = ...; // this code will never execute
}
Un continue
est normalement lié à une condition et cette condition peut généralement être utilisée à la place de continue
;
foreach (var obj in list)
{
if (condition)
continue;
// code
}
Pourrait juste être écrit comme
foreach (var obj in list)
{
if (!condition)
{
// code
}
}
continue
devient plus attrayant si vous pouvez avoir plusieurs niveaux de logique if
imbriquée dans la boucle. Une continue
au lieu d'une imbrication pourrait rendre le code plus lisible. Bien entendu, le refactoring de la boucle et des conditions conditionnelles dans des méthodes appropriées rendrait également la boucle plus lisible.
Le mot clé continue
est utilisé pour ignorer le reste du bloc de boucle et continuer. Par exemple:
for(int i = 0; i < 5; i++)
{
if(i == 3) continue; //Skip the rest of the block and continue the loop
Console.WriteLine(i);
}
Imprimera:
0
1
2
4
Lorsque vous ne voulez pas break
sortir de la boucle, mais que vous voulez la prochaine itération:
for (int i = 0; i < something; i++)
{
if (condition)
continue;
// expensive calculations, skip due to continue
// or due to the condition above I don't want to
// run the following code
stuff();
code();
}
Il empêche la nidification en profondeur.
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (condition1)
{
action1();
action2();
if (condition2)
{
action3();
}
}
}
pourrait être réécrit comme
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (!condition1)
{
continue;
}
action1();
action2();
if (!condition2)
{
continue;
}
action3();
}
Si les blocs de code ne sont pas triviaux mais verticalement plus grands, l'utilisation de continue
peut améliorer la lisibilité du code. Évidemment, il devrait être utilisé avec considération, comme toute autre construction de langage.
Vous devriez l'utiliser avec parcimonie.
Les meilleures boucles (= les plus faciles à lire) n'utilisent pas break
ou continue
, ce sont des sortes d'instructions goto structurées.
Cela dit, 1 ou même 2 instructions break/continue ne rendront pas une boucle illisible, mais il est utile de clarifier leur utilisation et de la garder simple.
continue
et break
sont en principe des déclarations meilleures (mais souvent simplement déguisées) goto
...
Chaque fois que vous êtes dans une boucle et que vous savez que tout ce qui va suivre doit être ignoré et poursuivi à la prochaine itération, vous pouvez utiliser continue
...
En tant que tels, ils doivent être utilisés rarement ... parfois ils rendent le code très lisible et clair (si l’alternative consisterait en plusieurs niveaux d’imbrication par exemple) ... la plupart du temps, ils ajoutent une confusion similaire à goto
.
Je suppose que la raison pour laquelle vous ne l’avez pas vue auparavant est que continue
est en quelque sorte un cousin des goto
, break
et début return
s des fonctions. Et nous savons tous que Goto est considéré comme dangereux , de nombreux développeurs ont donc tendance à l’éviter.
Pour moi, j’ai tendance à utiliser continue
lorsque je veux nettoyer une boucle où il peut y avoir des valeurs dont je ne me soucie pas. En utilisant continue
, je peux ignorer ces valeurs sans inclure la logique "importante" dans ma boucle dans une if
imbriquée.
foreach (var v in GetSomeValues())
{
if (ThisValueIsNotImportant(v)) continue;
//Do important stuff with the value.
}
Ai-je manqué quelque chose en ne l'utilisant pas?
Cela semble être une question étrange à poser. Vraisemblablement, vous savez mieux que quiconque si vous avez besoin de commencer tôt la prochaine itération d'une boucle.
Considérez-le comme un "retour", mais uniquement applicable au contexte d'une boucle. Un exemple courant est une machine à états qui boucle toutes les entrées disponibles.
while(!SomeQueue.Empty)
{
byte nextByte = SomeQueue.Dequeue();
switch State:
{
case A:
if(nextByte == Condition)
{
State = B;
}
else
{
State = ParseError;
}
continue;
case B:
//Test nextByte
State = C;
continue;
case C:
//Test nextByte
State = A;
continue;
case ParseError:
//Do something for this condition
State = A;
continue;
}
Vous pouvez également utiliser l'instruction continue pour l'optimisation du code. quand vous êtes sûr que hors de toutes conditions, au moins une condition va se rencontrer. vous pouvez l'utiliser comme ci-dessous,
foreach (var element in List)
{
if (condition1)
{
//do stuff .....
continue;
}
if (condition2)
{
//do stuff ....
continue;
}
.
.
.
if (condition)
{
//do stuff ....
continue;
}
}
Ici, lorsque l'une des conditions de l'instruction If est remplie, toutes les instructions if restantes sont ignorées.