考虑以下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#中是否可以这样?
答案 0 :(得分:7)
您可以将检查抽象为带有返回标志的方法:
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,但它通常不赞成,特别是在这样一个微不足道的情况下。 有时当你有许多嵌套循环或开关时它很有用,但这通常表明你可能需要重构/重新设计一下。正如您所指出的,您可以存储一个局部变量并进行检查,但是当您意识到时,这有点钝/臭。我更喜欢上面发布的这种方法,因为它变得非常易读。
编辑:关于您的评论和编辑过的问题,我不相信您的JavaScript代码中存在类似的语言功能。来自http://msdn.microsoft.com/en-us/library/37zc9d2w%28VS.80%29.aspx(强调补充):
在嵌套语句中,break语句只终止do, for,switch或while语句立即包含它。您可以 使用return或goto语句从更多内容中转移控制 深层嵌套的结构。
答案 1 :(得分:0)
这是由太多思考引起的问题类型。你可以简单地使用一个布尔值,如果在for循环之前满足你的条件就会被改变,只有当布尔值为真时运行你的方法,例如:
switch(x)
{
case 1:
bool donrun;
for(int i = 0; i < 10; i++)
{
int val = getValue(i);
if (val == 0)
donrun = true;
}
if(!donrun) doMoreStuff();
break;
case 2:
doSomeThingElse();
break;
default: throw new ArgumentOutOfRangeException();
}