从内部for循环中断开关语句?

Dan*_*don 4 .net c# controls goto structure

考虑以下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: ;
Run Code Online (Sandbox Code Playgroud)

我编写了类似于上面代码示例的代码.问题是我需要从内部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;
   }
}
Run Code Online (Sandbox Code Playgroud)

这样的事情可能在C#中出现吗?

Chr*_*air 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;
}
Run Code Online (Sandbox Code Playgroud)

只是为了扩展,你可以使用goto,但它通常不赞成,特别是在这样一个微不足道的情况下. 有时候,当你有许多嵌套的循环或开关时它很有用,但这通常表明你可能需要重构/重新设计一下.正如您所指出的,您可以存储一个局部变量并进行检查,但是当您意识到时,这有点钝/臭.我更喜欢上面发布的这种方法,因为它变得非常易读.

编辑:关于您的评论和编辑问题,我不相信您的JavaScript代码的类似语言功能存在于C#中.来自http://msdn.microsoft.com/en-us/library/37zc9d2w%28VS.80%29.aspx(重点补充):

在嵌套语句中,break语句仅终止直接包含它的do,for,switch或while语句.您可以使用return或goto语句从更深层次嵌套的结构中转移控件.

  • @DanielAllenLangdon:我不相信,也许用某些语言而不是C#.来自http://msdn.microsoft.com/en-us/library/37zc9d2w%28VS.80%29.aspx:_"在嵌套语句中,break语句仅终止do,for,switch或while语句你可以使用return或goto语句从更深层嵌套的结构中转移控制."_所以即使MSDN建议使用`return`或`goto`来退出嵌套结构. (2认同)