继续使用"Continue"是否有害?

22

开发人员是否应该避免在C#或其他语言中使用continue来强制进行循环的下一次迭代?这方面的争论是否与Goto有重叠之处?


1
这必定会在两个阵营之间引发一场争论。这是一个个人决定,有很多支持和反对的论点可以在其他地方找到。 - Tim Frey
1
到目前为止,答案都比较片面,我至少看到了两个我从未考虑过或在其他地方见过的论点。 - Brian
17个回答

81

我认为应更多地使用continue!

我经常遇到以下类似代码:

for (...)
{
   if (!cond1)
   {
      if (!cond2)
      {
          ... highly indented lines ...
      }
   }
}

取代

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

   ...
}

使用它可以使代码更易读!


for (...) { if (cond1 || cond2) continue; ... }我经常这样使用它,让你的代码更简洁。 - johnc
该死,如果上面的评论能够正确换行,那么这段代码就更好理解了。重点是要将if (cond1 || cond2) continue;放在一行上。 - johnc
在Perl中,它将是 next if cond1 || cond2; - Brad Gilbert
2
为什么不使用 if (!cond1 && !cond2) { 执行代码 } 而不是 if (cond1 || cond2) continue - Dennis
5
@Dennis - 关键是尽可能将“执行代码”块中有趣的代码保持在屏幕最左边。大多数情况下,我也发现没有否定词的条件语句更容易阅读。 - Rob Walker
1
@Dennis:因为你想避免“上帝”条件语句,这些语句在语义上包含了少量逻辑,但在物理上似乎包含了整个代码。 - Lightness Races in Orbit

24

在IT技术中,continuebreak相比,是否更有害?

如果说有区别的话,在我遇到或使用它的大多数情况下,continue让代码更清晰,不会像绕口令一样难以理解。


只有在使用RAII的情况下,才能避免break和continue导致的内存泄漏或更严重的问题。 - Fox
4
@Fox:这是任何一个在对象所有权/生命周期方面搞砸的人的错,而不是continue或break的错。 - Lightness Races in Orbit
@LightnessRacesinOrbit 完全同意。大多数优秀的编程团队都会将这些规则编码化。 - Fox
@Fox:迟到总比不来好吧? :) - Lightness Races in Orbit

12

你可以使用或不使用 continue 编写优秀的代码,也可以使用或不使用 continue 编写糟糕的代码。

关于 goto 的争论可能与此有一些重叠,但就我而言,正确使用 continue 相当于在循环中使用 break 语句或在方法体中从任何位置使用 return 语句——如果正确使用,它可以简化代码(更少的 bug,更易于维护)。


8

没有有害的关键词,只有对它们有害的使用。

goto本身并不有害,continue也是如此。它们需要谨慎使用,仅此而已。


这让我想到了“goto有哪些非有害的用途?”果然,StackOverflow上有一个相关问题:https://dev59.com/BnVD5IYBdhLWcg3wTZxm - thomasrutter

5

如果使用 continue 语句影响了代码的可读性,那么很可能你还有其他问题。比如,在 for 循环中有大量的代码。如果必须编写大型的 for 循环,建议在 for 循环的顶部附近使用 continue 语句。否则,深埋在 for 循环中的 continue 语句很容易被忽略。


5

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

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

这是否与我使用goto的原因相同?也许。有时我会为了可读性和停止代码嵌套而使用它们,但我通常更多地用于清理/错误处理。


3
我会说:“这要看情况。”
如果你的循环代码比较小(可以在不滚动屏幕的情况下查看整个循环代码),通常使用 continue 就可以了。
然而,如果循环体比较大(例如由于一个大的 switch 语句),并且有一些后续代码(例如在 switch 下面),你可能会通过添加 continue 而容易地引入错误,从而有时跳过那些代码。我曾经遇到过这种情况,在一个字节码解释器的核心部分,由于某些分支中出现了 continue,在某些时候导致无法执行一些插装代码。
这可能是一个有些人为构造的情况,但通常我会尽量避免使用 continue,并使用 if(但不要像 Rob 的示例代码中嵌套太深)。

2
就这位程序员而言,“嵌套的if/else”是有害的。

2
  1. 在循环开始时使用continue来避免迭代不必要的元素是没有害处的,而且非常有用,但是在嵌套的if和else中间使用它会使循环代码变得复杂,难以理解和验证。

  2. 我认为人们对其使用的回避也是语义上的误解。那些从未看到/写过'continue'关键字的人,在看到带有continue的代码时可能会将其解释为“自然流程的延续”。如果我们用next代替continue,我认为更多的人会欣赏这个有价值的游标特性。


2

我认为continue永远不会像goto那样困难,因为continue从不将执行移出它所在的代码块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接