继续认为有害吗?

时间:2008-09-11 20:50:58

标签: language-agnostic loops goto continue

开发人员是否应该避免在C#中使用continue或在其他语言中使用等效语言来强制循环的下一次迭代?支持或反对的论据是否与关于Goto的论点重叠?

17 个答案:

答案 0 :(得分:80)

我认为应该更多地使用continue!

我常常遇到像:

这样的代码
for (...)
{
   if (!cond1)
   {
      if (!cond2)
      {
          ... highly indented lines ...
      }
   }
}

而不是

for (...)
{
   if (cond1 || cond2)
   {
      continue;
   }

   ...
}

使用它来使代码更具可读性!

答案 1 :(得分:23)

continue 是否比 break 更有害?

如果有的话,在我遇到/使用它的大多数情况下,我发现它使代码更清晰,更少意大利面条。

答案 2 :(得分:12)

无论是否继续,您都可以编写好的代码,无论是否继续,您都可以编写错误的代码。

关于goto的参数可能有一些重叠,但就我而言,使用continue相当于使用break语句(在循环中)或从方法体中的任何位置返回语句 - 如果正确使用它可以简化代码(不太可能包含错误,更容易维护)。

答案 3 :(得分:7)

没有有害的关键字。只有它们的有害用途。

Goto本身并无害处,也不会继续。他们需要谨慎使用,就是这样。

答案 4 :(得分:5)

如果继续导致可读性问题,那么您可能还有其他问题。例如,for循环中的大量代码。如果你必须编写大的for循环,我会尝试坚持使用继续接近for循环的顶部。否则,很容易错过深埋在for循环中间的继续。

答案 5 :(得分:4)

我喜欢在循环开始时使用continue来处理简单的if条件。

对我来说,它使代码更具可读性,因为没有额外的嵌套,你可以看到我已经明确处理了这些情况。

这与我使用goto的原因相同吗?也许。我有时会将它们用于可读性并停止代码嵌套,但我通常更多地使用它们来进行清理/错误处理。

答案 6 :(得分:3)

我会说:“这取决于”。

如果你有相当小的循环代码(你可以在不滚动的情况下看到整个循环代码),通常可以使用continue。

但是,如果循环体很大(例如由于大的开关),并且有一些后续代码(比如在交换机下面),你可以通过添加一个继续来轻松引入错误,从而有时会跳过该代码。我在字节码解释器的核心遇到过这种情况,其中某些检测代码有时由于某些case分支中的继续而未执行。

这可能是一个有点人为构造的案例,但我通常会尽量避免继续并使用if(但不要像Rob的示例代码那样嵌套太深)。

答案 7 :(得分:2)

我不认为继续可能会像goto一样困难,因为继续从未将执行从其所在的代码块中移出。

答案 8 :(得分:2)

如果您正在迭代任何类型的结果集,并对所述结果执行操作,例如对于每个结果集,并且如果一个特定结果导致问题,则它在捕获预期错误时非常有用(通过尝试 - catch),记录它,然后继续前进到下一个结果。对于在奇数时间执行作业的无人值守服务,继续特别有用,imo,一个例外不应影响其他x个记录。

答案 9 :(得分:2)

  1. 在循环开始时使用continue来避免迭代不必要的元素是无害的并且非常有用,但是在嵌套ifs和elses的中间使用它可以将循环代码转换为复杂的迷宫,理解和验证。

  2. 我认为它的使用避免也是语义误解的结果。那些从未在代码中看到/写'continue'关键字的人,当看到带有continue的代码时,可以将其解释为“自然流程的延续”。例如,如果不是继续我们下一个,我认为会有更多人欣赏这个有价值的光标功能。

答案 10 :(得分:1)

goto可以用作继续,但不能反过来。

你可以在任何地方“转到”,从而任意打破流量控制。

因此继续,不会那么有害。

答案 11 :(得分:1)

其他人已经暗示过......但是编译器强制执行继续和中断,并拥有自己的关联规则。 Goto没有这样的限制,但在某些情况下,的净效果可能几乎相同。

我不认为继续或休息本身是有害的,虽然我确信要么可以使用任何一个让任何理智的程序员堵塞的方式。

答案 12 :(得分:1)

我会说是的。对我而言,它只是打破了流畅的代码片段的“流程”。

另一个论点也可能是,如果您坚持使用大多数现代语言支持的基本关键字,那么您的程序流程(如果不是逻辑或代码)可以移植到任何其他语言。拥有不受支持的关键字(即,继续或转到)会打破这一点。

这实际上更多的是个人偏好,但我从来没有使用它,并且在我编写新代码时并不认为它是一个选项。 (和goto一样。)

答案 13 :(得分:1)

就这个程序员而言,嵌套if / else 被认为是有害的。

答案 14 :(得分:0)

在大多数语言中,Continue是一个非常有用的函数,因为它允许在某些条件下跳过代码块。

一种替代方法是在if语句中使用布尔变量,但每次使用后都需要重置这些变量。

答案 15 :(得分:0)

对我来说继续感觉不对。休息让你离开那里,但继续似乎只是意大利面。

另一方面,您可以模拟继续中断(至少在Java中)。

for (String str : strs) contLp: {
    ...
       continue contLp;
    ...
}

继续在某些情况下可能有用,但它对我来说仍然感觉很脏。

for (char c : cs) {
    final int i;
    if ('0' <= c && c <= '9') {
        i = c - '0';
    } else if ('a' <= c && c <= 'z') {
        i = c - 'a' + 10;
    } else {
        continue;
    }
    ... use i ...
}

答案 16 :(得分:0)

我认为反对继续的底线论点是,它使得更难以证明代码是正确的。这在数学意义上得到证明。但它可能对你没关系,因为没有人有资源“证明”一个非常复杂的计算机程序。

输入静态分析工具。你可能会让事情变得更难......

而goto,听起来像是一场噩梦,出于同样的原因,但在代码中的任何随机位置。