最近,我正在处理一个开源项目,虽然我已经在 .NET 中开发了几年,但我之前没有偶然发现这个continue
关键字。
问题:有哪些最佳实践或领域可以从使用continue
关键字中受益?我以前可能没有看到它有什么原因吗?
如果适用,您可以使用它立即退出当前循环迭代并开始下一个循环。
foreach (var obj in list)
{
continue;
var temp = ...; // this code will never execute
}
Acontinue
通常与条件相关联,并且通常可以使用条件来代替continue
;
foreach (var obj in list)
{
if (condition)
continue;
// code
}
可以写成
foreach (var obj in list)
{
if (!condition)
{
// code
}
}
continue
如果您if
在循环中可能有多个级别的嵌套逻辑,则会变得更有吸引力。Acontinue
而不是嵌套可能会使代码更具可读性。当然,将循环和条件重构为适当的方法也会使循环更具可读性。
该continue
关键字用于跳过循环块的其余部分并继续。例如:
for(int i = 0; i < 5; i++)
{
if(i == 3) continue; //Skip the rest of the block and continue the loop
Console.WriteLine(i);
}
将打印:
0
1
2
4
它可以防止深度嵌套。
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (condition1)
{
action1();
action2();
if (condition2)
{
action3();
}
}
}
可以改写为
foreach(var element in collection)
{
doSomething();
doSomethingElse();
if (!condition1)
{
continue;
}
action1();
action2();
if (!condition2)
{
continue;
}
action3();
}
如果代码块不是微不足道的而是垂直更大,则使用continue
可能会提高代码的可读性。显然,它应该像其他所有语言结构一样慎重使用。
当你不想break
退出循环,但你想要下一次迭代时:
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();
}
你应该谨慎使用它。
最好的(= 最容易阅读的)循环不使用break
or continue
,它们是一种结构化的 goto 语句。
话虽如此,1 甚至 2 个 break/continue 语句不会使循环变得不可读,但让它们的使用清晰并保持简单是值得的。
基本上是更好continue
的break
(但通常只是伪装的)goto
陈述......
每当您在循环中并且知道循环中接下来的所有内容都应该被跳过并继续下一次迭代时,您可以使用continue
...
因此,它们应该很少使用......有时它们使代码非常可读和清晰(例如,如果替代方案是多层嵌套)......大多数时候它们会增加一些类似于goto
.
我猜你为什么以前没有见过它,它是函数的,和 early scontinue
的表亲。而且我们都知道Goto 被认为是有害的,因此许多开发人员可能倾向于避免使用它。goto
break
return
continue
对我来说,当我想清理可能存在一些我不关心的值的循环时,我倾向于使用它。使用continue
我可以跳过这些值,而无需将循环中的“重要”逻辑包含在嵌套的if
.
foreach (var v in GetSomeValues())
{
if (ThisValueIsNotImportant(v)) continue;
//Do important stuff with the value.
}
我是否因为不使用而错过了什么?
这似乎是一个奇怪的问题。大概您比其他任何人都更清楚您是否需要尽早开始循环的下一次迭代。
将其视为“返回”,但仅适用于循环的上下文。一个常见的例子是状态机,循环所有可用的输入。
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;
}
您也可以使用 continue 语句进行代码优化。当您确定在所有条件中,至多满足一个条件时。你可以像下面这样使用它,
foreach (var element in List)
{
if (condition1)
{
//do stuff .....
continue;
}
if (condition2)
{
//do stuff ....
continue;
}
.
.
.
if (condition)
{
//do stuff ....
continue;
}
}
在这里,当满足 If 语句的任何条件时,将跳过所有 if 语句的其余部分。