如何在C#中一次性打破多个循环?

Nic*_*ner 65 c# loops goto break

如果我有嵌套循环,我想立刻打破所有这些循环怎么办?

while (true) {
    // ...
    while (shouldCont) {
        // ...
        while (shouldGo) {
            // ...
            if (timeToStop) {
                break; // Break out of everything?
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在PHP中,break接受一个参数来确定要突破的循环数.可以在C#中完成这样的事情吗?

有什么可怕的东西,比如goto

// In the innermost loop
goto BREAK
// ...
BREAK: break; break; break;
Run Code Online (Sandbox Code Playgroud)

Mic*_*son 82

将嵌套循环提取到函数中然后可以使用return从任何地方退出循环,而不是中断.

  • 我不同意完全无光泽.相信需要退出职能的人数比那些讨厌搞砸的人少.原因是在许多语言中goto不执行正确的资源清理(当然不了解C#)但返回确实如此.IMHO功能还用于分组,确定范围和简化相关代码.这就是它的作用. (23认同)
  • 这是一个黑客,而不是什么功能,大多数讨厌goto的人都认为功能的早期回报同样糟糕.我不同意如此广泛的陈述,但我会说使用goto与问题的解决方案一样有效,但肯定不是那么整洁. (18认同)
  • 我们已经进入了 2018 年,C# 已经风光无限……但仍然没有多级中断或继续…… (2认同)

Fad*_*man 65

引入另一个控制标志并将其放入所有嵌套状态,如下所示.也取代了你的while(true)条件

bool keepLooping = true;
while (keepLooping) {
    // ...
    while (shouldCont && keepLooping) {
        // ...
        while (shouldGo && keepLooping) {
            // ...
            if (timeToStop) { 
                keepLooping  = false;
                break; // break out of everything?
            }
        }  
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1非常好!:)我发布了类似的东西,但你的更好,所以我删除了它. (2认同)
  • 我不明白,这比 goto 更容易阅读吗?你必须想出一个变量名来描述它打破所有循环的意图,你为什么不付出同样的努力来想出一个 goto 标签的名字呢?这毕竟更慢。您必须寻找使用 keepLo​​oking 的所有地方,而不仅仅是一个标签。 (2认同)

And*_*rew 27

Goto在被滥用时只是丑陋的.要退出某些嵌套的最内层循环,它是可以接受的.但是......人们不得不问为什么那里有如此多的筑巢.

简答:不.

  • +1.基本上,每个控制结构都在下面"转到"; 只是适合特定的目的.对于那些*不被*特殊目的覆盖的所有内容,除了`goto`之外没有其他"优雅"选项. (13认同)