更新:这个问题是我关于这个主题的文章的灵感。谢谢你的好问题!
“继续”和“中断”只不过是“goto”的一种令人愉快的语法。显然,通过给它们取可爱的名字并将它们的使用限制在特定的控制结构中,它们不再引起“所有 goto 都是坏的”人群的愤怒。
如果您要做的是继续到外部,您可以简单地在外部循环的顶部定义一个标签,然后“转到”该标签。如果您觉得这样做不会妨碍代码的可理解性,那么这可能是最方便的解决方案。
但是,我会借此机会考虑您的控制流是否会从重构中受益。每当我在嵌套循环中有条件“中断”和“继续”时,我都会考虑重构。
考虑:
successfulCandidate = null;
foreach(var candidate in candidates)
{
foreach(var criterion in criteria)
{
if (!candidate.Meets(criterion))
{ // TODO: no point in continuing checking criteria.
// TODO: Somehow "continue" outer loop to check next candidate
}
}
successfulCandidate = candidate;
break;
}
if (successfulCandidate != null) // do something
两种重构技术:
首先,将内部循环提取到一个方法中:
foreach(var candidate in candidates)
{
if (MeetsCriteria(candidate, criteria))
{
successfulCandidate = candidate;
break;
}
}
第二,可以消除所有的循环吗?如果您因为尝试搜索某些内容而循环,则将其重构为查询。
var results = from candidate in candidates
where criteria.All(criterion=>candidate.Meets(criterion))
select candidate;
var successfulCandidate = results.FirstOrDefault();
if (successfulCandidate != null)
{
do something with the candidate
}
如果没有循环,则无需中断或继续!