最近,我正在经历一个开源项目,虽然我已经在.NET中开发了几年,但之前我没有偶然发现 continue
关键字。
问题:使用continue
关键字可以带来哪些最佳做法或领域?我之前可能没有看过它吗?
答案 0 :(得分:43)
如果适用,您可以使用它立即退出当前循环迭代并开始下一个循环迭代。
foreach (var obj in list)
{
continue;
var temp = ...; // this code will never execute
}
continue
通常与条件相关联,通常可以使用该条件代替continue
;
foreach (var obj in list)
{
if (condition)
continue;
// code
}
可以写成
foreach (var obj in list)
{
if (!condition)
{
// code
}
}
如果你可能在循环中有几个级别的嵌套continue
逻辑,那么 if
会变得更有吸引力。 continue
而不是嵌套可能会使代码更具可读性。当然,将循环和条件重构为适当的方法也会使循环更具可读性。
答案 1 :(得分:15)
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
答案 2 :(得分:12)
它可以防止深度嵌套。
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
可以提高代码的可读性。显然它应该像其他语言构造一样被考虑使用。
答案 3 :(得分:11)
如果您不希望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();
}
答案 4 :(得分:7)
你应该谨慎使用它。
最好(=最容易阅读)的循环不使用break
或continue
,它们是一种结构化的goto语句。
话虽如此,1或甚至2个break / continue语句不会使循环变得不可读,但是要清楚地使用它并使其保持简单是值得的。
答案 5 :(得分:6)
基本上continue
和break
更好(但通常只是伪装)goto
陈述......
每当你进入一个循环并且知道循环中接下来的所有内容都应该被跳过并继续下一次迭代时你可以使用continue
......
因此它们应该很少使用......有时候它们会使代码非常易读和清晰(例如,如果备选方案可能是几个级别的嵌套)......大多数时候它们会增加类似{{1}的混淆}}
答案 6 :(得分:4)
我猜你以前没见过的原因是continue
是goto
,break
和早期return
来自函数的堂兄弟。而且我们都知道Goto is considered harmful,许多开发人员可能会倾向于避免它。
对我来说,当我想清理一个可能有一些我不关心的值的循环时,我倾向于使用continue
。使用continue
我可以跳过这些值,而不会在嵌套if
的循环中包含“重要”逻辑。
foreach (var v in GetSomeValues())
{
if (ThisValueIsNotImportant(v)) continue;
//Do important stuff with the value.
}
答案 7 :(得分:3)
我是否错过了任何不使用它的东西?
这似乎是一个奇怪的问题。据推测,你比任何人都更清楚,你是否需要尽早开始下一轮循环。
答案 8 :(得分:3)
将其视为“返回”,但仅适用于循环的上下文。 一个常见的例子是状态机,循环遍历所有可用的输入。
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;
}
答案 9 :(得分:0)
您也可以使用continue语句进行代码优化。当你确定在所有条件下,至少有一个条件会满足。你可以像下面这样使用它,
foreach (var element in List)
{
if (condition1)
{
//do stuff .....
continue;
}
if (condition2)
{
//do stuff ....
continue;
}
.
.
.
if (condition)
{
//do stuff ....
continue;
}
}
这里,当满足任何If语句的条件时,将跳过所有if语句的其余部分。