sirven - Cuándo usar la palabra clave ''continuar'' en C#
palabras reservadas en c# y su significado (10)
Recientemente, estaba pasando por un proyecto de código abierto y, aunque he estado desarrollando durante varios años en .NET, no había tropezado con la palabra clave " continue
antes.
Pregunta: ¿Cuáles son algunas de las mejores prácticas o áreas que se beneficiarían con el uso de la palabra clave continue
? ¿Hay alguna razón por la que no la haya visto anteriormente?
¿Me he perdido algo por no usarlo?
Parece una pregunta extraña. Probablemente, usted sabe, mejor que nadie, si ha necesitado comenzar la próxima iteración de un ciclo antes de tiempo.
Básicamente, continue
y break
son mejores (pero a menudo solo disfrazadas) goto
sentencias ...
Siempre que esté dentro de un bucle y sepa que todo lo que viene después del bucle debe omitirse y continuar con la siguiente iteración que podría usar continue
...
Como tales, deben usarse rara vez ... a veces hacen que el código sea muy legible y claro (si la alternativa sería varios niveles de anidamiento, por ejemplo) ... la mayoría de las veces agregan cierta confusión similar a goto
.
Cuando no quiere salir del bucle, pero desea la siguiente iteración:
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();
}
Deberías usarlo con moderación.
Los bucles mejores (= más fáciles de leer) no usan break
o continue
, son un tipo de declaraciones goto estructuradas.
Dicho esto, 1 o incluso 2 declaraciones de ruptura / continuación no harán que un bucle sea ilegible, pero vale la pena dejar claro su uso y hacerlo simple.
La palabra clave continue
se usa para omitir el resto del bloque de bucle y continuar. Por ejemplo:
for(int i = 0; i < 5; i++)
{
if(i == 3) continue; //Skip the rest of the block and continue the loop
Console.WriteLine(i);
}
Se imprimirá:
0
1
2
4
Lo usa para salir inmediatamente de la iteración del bucle actual y comenzar la siguiente, si corresponde.
foreach (var obj in list)
{
continue;
var temp = ...; // this code will never execute
}
Una continue
normalmente está vinculada a una condición, y la condición generalmente se puede usar en lugar de la continue
;
foreach (var obj in list)
{
if (condition)
continue;
// code
}
Simplemente podría ser escrito como
foreach (var obj in list)
{
if (!condition)
{
// code
}
}
continue
vuelve más atractivo si puede tener varios niveles de lógica anidada dentro del bucle. Una continue
lugar de anidar puede hacer que el código sea más legible. Por supuesto, refactorizar el bucle y los condicionales en métodos apropiados también haría que el bucle sea más legible.
Piense en ello como un "retorno", pero solo aplicable al contexto de un bucle. Un ejemplo común es una máquina de estado, repitiendo sobre todas las entradas 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;
}
Previene la anidación profunda.
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (condition1)
{
action1();
action2();
if (condition2)
{
action3();
}
}
}
podría ser reescrito como
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (!condition1)
{
continue;
}
action1();
action2();
if (!condition2)
{
continue;
}
action3();
}
Si los bloques de código no son triviales sino verticalmente más grandes, el uso de continue
puede mejorar la legibilidad del código. Obviamente, debe usarse con consideración, como cualquier otra construcción de lenguaje.
Supongo que por qué no lo has visto anteriormente es que continue
es una especie de primo para goto
, break
y return
temprano de las funciones. Y todos sabemos que Goto se considera dañino , por lo que muchos desarrolladores probablemente tienden a evitarlo.
Para mí, tiendo a usar continue
cuando quiero limpiar un bucle donde puede haber algunos valores que no me importan. Si uso continue
, puedo omitir esos valores sin incluir la lógica "importante" en mi bucle en un anidado if
.
foreach (var v in GetSomeValues())
{
if (ThisValueIsNotImportant(v)) continue;
//Do important stuff with the value.
}
También puede utilizar la instrucción continue para la optimización del código. cuando esté seguro de que fuera de todas las condiciones, casi una condición se va a cumplir. Puedes usarlo como a continuación,
foreach (var element in List)
{
if (condition1)
{
//do stuff .....
continue;
}
if (condition2)
{
//do stuff ....
continue;
}
.
.
.
if (condition)
{
//do stuff ....
continue;
}
}
Aquí, cuando se cumple alguna de las condiciones de la declaración If, el resto de las instrucciones se omitirán.