14

在研究了退出嵌套循环的方法后,我决定尝试使用goto,

private void example()
{
    for (int i = 0; i < 100; i++)
    {
        for (int ii = 0; ii < 100; ii++)
        {
            for (int iii = 0; iii < 100; iii++)
            {
                goto exitMethod;
            }                
        }             
    }

exitMethod:
}

但是由于某种原因,如果我goto在方法的最后加上一个标签,Visual Studio 2012 (Ultimate) 就会抱怨(并且它不会编译),

截屏

但是,如果我将代码更改为此,

private void example()
{
    for (int i = 0; i < 100; i++)
    {
        for (int ii = 0; ii < 100; ii++)
        {
            for (int iii = 0; iii < 100; iii++)
            {
                goto exitMethod;
            }                
        }             
    }

exitMethod:

    int someUnneededVariable; // Just an example, if I add ANY piece of code the error vanishes.
}

没有出现任何错误(并且可以编译);我已经搜索了我所知道的所有 MSDN 参考资料,但我找不到任何关于此的内容。

我知道我可以通过使用轻松解决这个问题return;;即便如此,我仍然想找出导致此错误的原因。

4

6 回答 6

19

标签本身并不存在:它标记了一个语句。从 C# 5 规范的第 8.4 节:

带标签的语句允许以标签为前缀的语句。块中允许带标签的语句,但不允许作为嵌入语句。

在这种情况下,您在方法的末尾应用标签 - 没有声明它. 所以编译器拒绝你的代码是绝对正确的。

如果你真的想要,你可以在一个多余的 return 语句中添加一个标签:

exitMethod:
    return;
}

...或者只是一个空的声明,正如 Irfan 所建议的那样。不过,必须有一个声明。

但我不会推荐它。只需将任何goto exitMethod;语句更改为 simple return

于 2013-08-30T14:29:44.983 回答
9

您可以放置​​空白语句。

尝试:

exitMethod: ;            

但无论如何,如果您真的想从当前方法返回,请使用 return 语句。如果方法具有除 void 以外的其他返回类型,

return (type);

除此以外

return;
于 2013-08-30T14:30:55.180 回答
1

在这种情况下

goto exitMethod;

相当于只是简单

return;

并且该计划回报明显更具可读性。所以我不明白你为什么要这样做。

于 2013-08-30T14:28:58.987 回答
0

你需要一些事情goto去做。不能为空。

例如:

private void example()
{
    for (int i = 0; i < 100; i++)
    {
        for (int ii = 0; ii < 100; ii++)
        {
            for (int iii = 0; iii < 100; iii++)
            {
                goto exitMethod;
            }                
        }             
    }

exitMethod:
    int i = DoSomething();
}
于 2013-08-30T14:28:59.437 回答
0
"The goto statement transfers the program control directly to a labeled statement." 

你有exitMethod你的标签,但在你的第一个例子中你没有声明。这就是您收到错误的原因。

转到参考

于 2013-08-30T14:29:48.553 回答
-1

有两件事,首先不推荐 goto。由于标签的工作方式,它不允许您使用这样的标签。标签是源代码唯一标识符,允许您指向特定指令。在您尝试的情况下,它后面没有指令,因此它无法解析到指令的位置。这导致了您的错误。

同样,您不应该以这种方式使用 goto。如果只需要退出函数,可以使用return;语句。如果您使用的编码标准仅规定了一个返回点,请尝试以下操作:

private void example()
{
    bool escaping = false;
    for (int i = 0; i < 100 && !escaping; i++)
    {
        for (int ii = 0; ii < 100 && !escaping; ii++)
        {
            for (int iii = 0; iii < 100 && !escaping; iii++)
            {
                escaping = true;
                break; // this is only needed if there is code farther down this 
                       // inner loop that would otherwise be executed.
            }                
        }             
    }

return;
}
于 2013-08-30T14:33:32.910 回答