【问题标题】:Nested for-each and if-else statement without goto statement没有 goto 语句的嵌套 for-each 和 if-else 语句
【发布时间】:2014-05-12 17:42:01
【问题描述】:

我有一个嵌套的 for-each 和 if-else 案例,如下所示。在这些情况下,如果 if-else 基于 if-else 语句,我必须转到循环的开头或循环中的其他位置。 GOTO 是处理这种情况的唯一方法吗?或者它可以是更好的设计? 为简洁起见,我只包含了两个 for-each,但在我的例子中,我有 4 个 for-each 和大约 13 个 if-else 语句。

【问题讨论】:

  • 我有 4 个 for-each 和大约 13 个 if-else 语句 听起来像是设计问题和可怕的复杂性。
  • 将您正在检查的内容和操作分解为不同的方法。
  • 人们在这种情况下使用 GOTO,这就是很多人认为它是邪恶的原因。这种意大利面条式的代码非常难以理解和遵循代码流。
  • @DanTeesdale Break 会让我退出当前循环/条件,但不会进入最上面的循环,或者可能是最里面的循环。
  • @Zerotoinfinite 为什么要在熟悉循环后验证循环?您只需使用if(ComputerStarted() && HardDiskValid() && KeyboardPluggedIn()){DoSomething();} 开始循环如果碰巧其中一种验证方法需要循环,就这样吧,但外部循环不需要知道或关心它。

标签: c# .net if-statement foreach goto


【解决方案1】:

如果你的方法那么长,那就是难闻的气味。将其分解为更小的方法或更小的类。这样可以更轻松地跳转到其他位置。

也许state machine principles会帮你设置下一个状态。

【讨论】:

  • 那么... yield return 那么?
  • @RobertHarvey 我不这么认为。但可能与收益中断相结合;
【解决方案2】:

Goto 不是唯一的方法,但它可能是执行这种“多级continue”的最干净的方法。另一种方法是设置标志,然后在每个循环的顶部检查是否设置了适当的标志,但如果你这样做,你正在操纵状态,使代码复杂化更多if条件,并增加可能性错误。

如果可以,请考虑重构。内部循环可能可以通过return 语句重构为自己的方法。

另见
goto (C# Reference)

goto 的一个常见用途是将控制权转移到特定的 switch-case 标签或 switch 语句中的默认标签。 goto 语句 对于摆脱深度嵌套的循环也很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多