gpt4 book ai didi

c# - 从内部 for 循环中中断封闭的 switch 语句?

转载 作者:太空狗 更新时间:2023-10-30 00:43:23 24 4
gpt4 key购买 nike

考虑以下 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 (强调):

Within nested statements, the break statement terminates only the do, for, switch, or while statement that immediately encloses it. You can use a return or goto statement to transfer control from within more deeply nested structures.

关于c# - 从内部 for 循环中中断封闭的 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11349427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com