Bri*_*ott 96 .net c# coding-style goto
我想知道是否还有人在C#中使用"goto"关键字语法,以及可能的原因.
我倾向于查看任何导致读者跳过代码作为不良做法的陈述,但想知道是否有任何可信的场景使用这样的语法?
Hei*_*nzi 87
有一些(罕见的)goto实际上可以提高可读性的情况.实际上,您链接的文档列出了两个示例:
goto的一个常见用途是将控制转移到特定的switch-case标签或switch语句中的默认标签.
goto语句对于摆脱深层嵌套循环也很有用.
以下是后者的示例:
for (...) {
for (...) {
...
if (something)
goto end_of_loop;
}
}
end_of_loop:
Run Code Online (Sandbox Code Playgroud)
当然,还有其他方法可以解决这个问题,例如将代码重构为函数,在其周围使用虚拟块等等(有关详细信息,请参阅此问题).作为旁注,Java语言设计者决定完全禁止goto并引入带标签的break语句.
V4V*_*tta 63
我记得这部分
switch (a)
{
case 3:
b = 7;
// We want to drop through into case 4, but C# doesn't let us
case 4:
c = 3;
break;
default:
b = 2;
c = 4;
break;
}
Run Code Online (Sandbox Code Playgroud)
对于这样的事情
switch (a)
{
case 3:
b = 7;
goto case 4;
case 4:
c = 3;
break;
default:
b = 2;
c = 4;
break;
}
Run Code Online (Sandbox Code Playgroud)
请参阅此
goto非常适合打破许多循环,其中break不能很好地工作(比如错误条件),并且正如Kragen所说,编译器使用goto来生成switch语句和其他一些东西.
编译器goto在各种生成的代码中使用语句,例如在生成的迭代器块类型中(使用yield return关键字时生成)- 我很确定生成的XML序列化类型goto在某处也有一些语句.
请参阅Iterator块实现详细信息:自动生成的状态机,以获取有关C#编译器处理此问题的原因/方式的更多详细信息.
除了生成的代码之外,没有充分的理由goto在普通代码中使用语句 - 它使代码更难理解,因此更容易出错.另一方面,goto在生成的代码中使用这样的语句可以简化生成过程并且通常很好,因为没有人会读取(或修改)生成的代码,并且由于机器正在进行编写而不会出错.
请参阅认为对参数有害的Go-to语句goto以及经典的编程历史记录.
我不记得曾经使用过goto.但也许它改善了你永远不想退出的永久循环的意图(不break,但你仍然return可以throw):
forever: {
// ...
goto forever;
}
Run Code Online (Sandbox Code Playgroud)
再说一次,简单while (true)应该就够了......
此外,您可以在需要循环的第一次迭代在循环中间开始的情况下使用:在此处查看示例.