35

最近,我正在处理一个开源项目,虽然我已经在 .NET 中开发了几年,但我之前没有偶然发现这个continue关键字。

问题:有哪些最佳实践或领域可以从使用continue关键字中受益?我以前可能没有看到它有什么原因吗?

4

10 回答 10

54

如果适用,您可以使用它立即退出当前循环迭代并开始下一个循环。

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而不是嵌套可能会使代码更具可读性。当然,将循环和条件重构为适当的方法也会使循环更具可读性。

于 2011-11-01T21:27:29.143 回答
17

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
于 2011-11-01T21:27:44.567 回答
15

它可以防止深度嵌套。

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可能会提高代码的可读性。显然,它应该像其他所有语言结构一样慎重使用。

于 2011-11-01T21:29:48.030 回答
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();
}
于 2011-11-01T21:26:48.447 回答
8

你应该谨慎使用它。

最好的(= 最容易阅读的)循环不使用breakor continue,它们是一种结构化的 goto 语句。

话虽如此,1 甚至 2 个 break/continue 语句不会使循环变得不可读,但让它们的使用清晰并保持简单是值得的。

于 2011-11-01T21:28:08.533 回答
7

基本上是更好continuebreak(但通常只是伪装的)goto陈述......

每当您在循环中并且知道循环中接下来的所有内容都应该被跳过并继续下一次迭代时,您可以使用continue...

因此,它们应该很少使用......有时它们使代码非常可读和清晰(例如,如果替代方案是多层嵌套)......大多数时候它们会增加一些类似于goto.

于 2011-11-01T21:30:28.210 回答
6

我猜你为什么以前没有见过它,它是函数的,和 early scontinue的表亲。而且我们都知道Goto 被认为是有害的,因此许多开发人员可能倾向于避免使用它。gotobreakreturn

continue对我来说,当我想清理可能存在一些我不关心的值的循环时,我倾向于使用它。使用continue我可以跳过这些值,而无需将循环中的“重要”逻辑包含在嵌套的if.

foreach (var v in GetSomeValues())
{
  if (ThisValueIsNotImportant(v)) continue;

  //Do important stuff with the value.
}
于 2011-11-01T21:31:42.623 回答
3

我是否因为不使用而错过了什么?

这似乎是一个奇怪的问题。大概您比其他任何人都更清楚您是否需要尽早开始循环的下一次迭代。

于 2011-11-01T21:29:43.387 回答
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;
}
于 2011-11-01T21:32:44.490 回答
0

您也可以使用 continue 语句进行代码优化。当您确定在所有条件中,至多满足一个条件时。你可以像下面这样使用它,

foreach (var element in List)
{
    if (condition1)
    {
        //do stuff .....
        continue;
    }
    if (condition2)
    {
        //do stuff ....
        continue;
    }
    .
    .
    .
    if (condition)
    {
        //do stuff ....
        continue;
    }
}

在这里,当满足 If 语句的任何条件时,将跳过所有 if 语句的其余部分。

于 2017-09-07T17:47:41.370 回答