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

有帮助吗?

解决方案

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

我经常遇到这样的代码:

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

代替

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

   ...
}

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

其他提示

continue 比说更有害的, break?

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

无论是否继续,您都可以编写出好的代码,无论是否继续,您都可以编写糟糕的代码。

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

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

Goto 本身并无害处,Continue 也无害。它们需要小心使用,仅此而已。

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

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

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

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

我会说:“这取决于”。

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

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

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

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

如果您正在迭代任何类型的结果集,并对所述结果执行操作,例如在每个结果中,并且如果一个特定结果导致问题,那么它在捕获预期错误(通过 try-catch)方面非常有用,记录它,并通过继续转到下一个结果。在我看来,“继续”对于在非正常时间执行作业的无人值守服务特别有用,并且一个异常不应影响其他 x 条记录。

  1. 在循环开始时使用 continue 来避免迭代不必要的元素并不是有害的,而且非常有用,但在嵌套的 if 和 else 中间使用它可以将循环代码变成复杂的迷宫,以便于理解和验证。

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

goto 可以用作继续,但反之则不行。

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

这样继续下去,就不会那么有害了。

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

我不认为 continue 或 break 本身是有害的,尽管我确信任何一个使用不当都会让任何理智的程序员感到恶心。

我会说是的。对我来说,它只是破坏了一段流畅编写的代码的“流程”。

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

这实际上更多的是个人喜好,但我从来没有必要使用它,并且在编写新代码时并不真正认为它是一个选项。(与转到相同。)

对于这位程序员来说, 嵌套 if/else 被认为是有害的。

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

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

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

另一方面,你可以用break来模拟继续(至少在Java中)。

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

continue 在某些情况下很有用,但对我来说仍然感觉很脏。

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 ...
}

我认为反对继续的底线论点是它使得证明代码正确变得更加困难。这是数学意义上的证明。但这对你来说可能并不重要,因为没有人有资源来“证明”一个非常复杂的计算机程序。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top