考虑以下 C#:
// C# .net
switch(x)
{
case 1:
for(int i = 0; i < 10; i++)
{
int val = getValue(i);
if (val == 0)
goto endswitch;
}
doMoreStuff();
break;
case 2:
doSomeThingElse();
break;
default: throw new ArgumentOutOfRangeException();
}
endswitch: ;
我已经编写了类似于上述代码示例的代码。问题是我需要从内部 for 循环内部中断 switch 语句。如果我在那里放一个
break
语句,它只会破坏内部 for 循环,然后继续执行 doMoreStuff()
,这不是我需要的。在这里似乎最有效的替代方法是
goto
语句,但我知道这是不受欢迎的。另一种选择是在 for 循环内跟踪一个单独的变量,但这会增加代码行并且不太优雅。
做这个的最好方式是什么?
更新:我已经读到有一种方法可以在 JavaScript 中做到这一点。它是这样工作的:(http://www.devguru.com/technologies/ecmascript/quickref/break.html)
// JavaScript
outer_loop:
for(i=0; i<3; i++)
{
document.write("<BR>" + "outer " + i + ": ");
for(j=0; j<5; j++)
{
document.write("inner " + j + " ");
if(j==x)
break outer_loop;
}
}
在 C# 中可能有这样的事情吗?
最佳答案
您可以将检查抽象为带有返回标志的方法:
switch(x)
{
case 1:
if (ShouldDoMoreStuff())
doMoreStuff();
break;
case 2:
doSomeThingElse();
break;
default: throw new ArgumentOutOfRangeException();
}
private bool ShouldDoMoreStuff()
{
for(int i = 0; i < 10; i++)
{
var val = getValue(i);
if (val == 0)
return false;
}
return true;
}
只是为了扩展,您可以像以前一样使用 goto,但它通常不受欢迎,尤其是在这种微不足道的情况下。有时,当您有许多嵌套循环或开关时它很有用,但这通常表明您可能应该稍微重构/重新设计。正如您所指出的,您可以存储一个局部变量并进行检查,但正如您所意识到的那样,这有点迟钝/难闻。我更喜欢我上面发布的这种方法,因为它变得非常易于使用。
编辑:关于您的评论和编辑的问题,我认为 C# 中不存在与您的 JavaScript 代码类似的语言功能。来自 http://msdn.microsoft.com/en-us/library/37zc9d2w%28VS.80%29.aspx(强调):
关于c# - 从内部for循环中断封闭的switch语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11349427/