goto
打破循环,然后根据特定条件返回开始声明
goto
打破循环,然后根据特定条件返回开始声明
Answers:
在某些(很少)情况下,goto可以真正提高可读性。实际上,您链接到的文档列出了两个示例:
goto的常见用法是将控制权转移到特定的切换用例标签或switch语句中的默认标签。
goto语句对于摆脱深层嵌套的循环也很有用。
这是后一个示例:
for (...) {
for (...) {
...
if (something)
goto end_of_loop;
}
}
end_of_loop:
当然,还有其他方法可以解决此问题,例如将代码重构为函数,在其周围使用伪块等(有关详细信息,请参见此问题)。作为附带说明,Java语言设计人员决定完全禁止goto并引入带标签的break语句。
我记得这部分
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;
}
对于这样的事情
switch (a)
{
case 3:
b = 7;
goto case 4;
case 4:
c = 3;
break;
default:
b = 2;
c = 4;
break;
}
推荐这个
我在Eduasync中广泛使用了它,以显示在C#5中使用异步方法时编译器为您生成的代码类型。您会在迭代器块中看到相同的内容。
在“普通”代码中,我不记得上次使用它了。
goto非常适合打破很多循环,在这些循环中,break不能很好地工作(例如在错误情况下),正如Kragen所说,goto被编译器用来生成switch语句和其他一些东西。
我不记得曾经使用过goto
。但也许它可以改善您永远不想退出的永久循环的意图(否break
,但您仍然可以return
或throw
):
forever: {
// ...
goto forever;
}
再说一次,一个简单的while (true)
就足够了...
同样,您可以在希望循环的第一次迭代在循环的中间开始的情况下使用:在此处查看示例。
goto
..和while(true) {..}
是不是一个有趣的使用..
编译器goto
在各种生成的代码中使用语句,例如,在生成的迭代器块类型中使用语句(使用yield return
关键字时生成-我很确定生成的XML序列化类型goto
在某处也有一些语句。
有关C#编译器为何/如何处理此问题的更多详细信息,请参见迭代器块实现细节:自动生成的状态机。
除了生成的代码之外,没有充分的理由goto
在普通代码中使用语句-它使代码更难以理解,因此更容易出错。另一方面,goto
在生成的代码中使用这样的语句可以简化生成过程,并且通常很好,因为没有人会读取(或修改)生成的代码,并且由于机器正在执行写操作,因此不会出现任何错误。
请参阅Go-to语句,它被视为有害的论点goto
以及一段经典的编程历史。
goto
才不是。需要考虑的事情。
处理器至少执行一条跳转指令,而且我敢肯定,很多语句会在其实现或解释中使用这些指令。
使用第3或第4代语言的好处之一是,这些物理细节是从我们这里抽象出来的。尽管我们应该注意泄漏抽象定律,但我认为我们也应该按预期使用我们的工具(对不起)。如果我正在编写代码并且goto
似乎是个好主意,那么该是重构的时候了。结构化语言的目的是避免这些“跳跃”并在我们的工程中创建逻辑流程。
我应该避免使用,break
但不能忽视其性能优势。但是,如果我有相互需要的嵌套循环,break
那就该重构了。
如果有人可以提议使用goto
它似乎比重构更好,那么我很乐意撤回我的回答。
我希望我对赶赴这里的“ 自行车棚 ” 不感到内。就像Kragen所说的那样,对Dijkstra来说足够好对我来说也足够好。
dynamic
拿一个对象并走它的对象图,其中包含多个字典以求出所需的值。使用参数为,dynamic
但期望对象形状精确的方法没有意义。使用goto可以突破多层并继续遍历这些对象的集合。[我不拥有这些类型,所以我无法提供更好的访问权限,因此它具有反射性或动态性]
后藤再好不过了。并继续,中断(在切换/情况下除外),(多次)返回和投掷也应保持在最低水平。您永远都不想从嵌套循环的中间逃脱。您始终希望循环控制语句具有所有循环控制。缩进具有信息,所有这些语句都会丢弃该信息。您不妨删除所有缩进。