在C#中是否有类似于Java的标签中断(labelled break)的等效功能或解决方法?

41
我正在将一些Java代码转换成C#,发现了一些带有标签的"break"语句(例如)。
label1:
    while (somethingA) {
       ...
        while (somethingB) {
            if (condition) {
                break label1;
            }
        }
     }

在C#中有没有相应的功能(目前的阅读表明没有),如果没有,除了使用布尔标志来指示是否在每个循环结束时中断(例如),还有其他的转换方法吗?
bool label1 = false;
while (somethingA)
{
   ...
    while (somethingB)
    {
        if (condition)
        {
            label1 = true;
            break;
        }
    }
    if (label1)
    {
        break;
    }
}
// breaks to here

我对为什么C#没有这个功能感兴趣,因为它似乎并不邪恶。
1个回答

51

您可以使用goto直接跳转到一个标签。

while (somethingA)
{
    // ...
    while (somethingB)
    {
        if (condition)
        {
            goto label1;
        }
    }
}
label1:
   // ...

在类C语言中,goto通常用于跳出嵌套循环,相比于在每次循环结束时跟踪布尔变量并重复检查它们,这样做更简洁。


10
不用客气。我之前没有意识到 Java 也有标记语句,这样我们就扯平了 :P - Mark Rushakoff
9
如果可以这样安排的话,使用 return 语句比较简洁。 - Robert Harvey
2
@MarkRushakoff,你应该编辑你的回答...他并不是真正在询问用于循环控制的布尔变量,所以你不应该提到它们来混淆问题。此外,goto并不像标记的break语句那样好,因为goto不能强制分支仅限于块的退出...你可以随意使用goto。 - JoelFan
7
我想向未来的读者指出,goto语句仅限于所在方法的范围内,并且无法跳过变量声明。你无法跳出所在方法。即使在现今的C#中,这一点仍然适用。 - Hazel へいぜる

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接