使用continue关键字的目的是什么

时间:2015-03-24 09:43:06

标签: c# continue

我刚刚发现了一段看起来像这样的代码;

for(;;)
{
    if (condition)
    {
        continue;
    }
    DoSomething();
}

编写像这样的代码而不仅仅是这样做有什么意义;

for(;;)
{
    if (!condition)
    {
        DoSomething();
    }             
}

3 个答案:

答案 0 :(得分:2)

在您的特定情况下 - 完全没有区别,因为条件下的代码块是单方法调用。

但是,如果不满足条件时运行的代码不是对DoSomething();的单个调用,而是一些足够大的代码块 - 那么当使用语法时,您将获得稍微更少的嵌套级别(以及稍微更易读的代码) continue

考虑一下:

for(;;)
{
    if (condition)
        continue;

    DoSomething();
    DoSomethingElse();
    DoAnything();
    ....
    DoAnythingElse();
}

for(;;)
{
    if (!condition)
    {
        DoSomething();
        DoSomethingElse();
        DoAnything();
        ....
        DoAnythingElse();
    }
}

由于嵌套/缩进程度较高,第二个样本看起来不太可读。

答案 1 :(得分:2)

当你添加更多这样的"破坏条件时,可读性的可能性变得显而易见":

for(;;)
{
    if (condition1)
    {
        continue;
    }
    if (condition2)
    {
        continue;
    }
    if (condition3)
    {
        continue;
    }
    DoSomething();
}

这样可以逐个检查导致迭代跳过的条件。

将其转换为替代形式:

for(;;)
{
    if (!condition1 && !condition2 && !condition3)
    {
        DoSomething();
    }             
}

可以说,这比上面的可读性稍差。一旦在continue

之前实际存在一些活动(例如日志输出),它就会变得更糟
for(;;)
{
    if (condition1)
    {
        Log("condition1");
    }
    else
    {
        if (condition2)
        {
            Log("condition2");
        }
        else
        {
            if (condition3)
            {
                Log("condition3");
            }
            else
            {
                DoSomething();
            }
        }
    }
}

VS。与continue

for(;;)
{
    if (condition1)
    {
        Log("condition1");
        continue;
    }
    if (condition2)
    {
        Log("condition2");
        continue;
    }
    if (condition3)
    {
        Log("condition3");
        continue;
    }
    DoSomething();
}

答案 2 :(得分:2)

这种继续使用更常与代码结构相关联:

for (; exitCondition;) {
  AlwaysDoDomething();
  if (condition) {
    continue;
  }
  SometimesDoSomething();
}

IE中。循环中有两个代码块,条件仅控制第二个块。人们可能更喜欢

for (; exitCondition;) {
  AlwaysDoDomething();
  if (!condition) {
    SometimesDoSomething();
  }
}

但这假设condition足够简单,以致否定不会在表达式中丢失(考虑condition实际上是expression1 || expression2 || expression3,其中子表达式本身是非不重要的)。并且SometimesDoSomething很短,因此很明显if控制的区块很短。

最明显的是主观在很大程度上取决于具体情况。