我已经阅读了多篇文章,说使用goto在编程中是一个巨大的不。但有些人明确表示滥用goto是错误的,在某些情况下,如切换案例,这是预期用途。
所以我的问题是,为了将来参考,这是最佳实践/更有效率。
这样:
switch (a)
{
case 1:
//Something specific for case 1
break;
case 2:
//Something specific to default and case 2
break;
default:
//Something specific for default
goto case 2;
}
或者这个:
switch (a)
{
case 1:
//Something specific for case 1
break;
case 2:
//Something specific to default and case 2
thatFunction();
break;
default:
//Something specific for default
thatFunction();
break;
}
void thatFunction() { /*Case 2 stuff*/ }
编辑:这两个switch语句都是示例,实际代码包含更多案例。
我工作场所的每个人都从未使用过goto或者说他们只是听说过从未使用过它。所以我来到这里是为了得到明确的答案。我正在寻找答案和解释或指向其中的链接。 谢谢,
答案 0 :(得分:2)
你总是需要理解任何" no-no"背后的原因。 (或"是 - 是")。通过这种方式,您可以了解应用规则的合理位置,以及它不适用的地方。
对goto
的大斗争一直回到编程,没有真正的程序和功能,甚至像循环一样简单。 goto
允许你从任何地方跳到其他任何地方,并且很难想到它实际意味着什么。 "不要使用goto"是结构化代码运动的一部分,而不是代码中的大量跳转;使用for (int i = 10; i > 0; i--) { ... }
之类的东西进行迭代,而不是if (i-- > 0) goto startLoop;
。
在switch
中,goto
受到约束 - 它只能做一件事,执行switch
语句的分支。实际上,在C#中,即使在switch
语句之外,goto
也是非常有约束力和安全的,并且很少有任何在" Goto是邪恶的时候所带来的含义"运动开始了。这并不意味着你应该开始用goto
替换你的所有循环,当然:)
现在,如果事情变得复杂,那么switch
可能不是一个很好的解决方案。也许您可以使用不同的结构来执行您尝试执行的操作 - 在C#中有多种方法可以进行多态和/或代码重用,其中一种可能是更好的方法,可以让您使用更清晰的代码来做你想做的事情。但我们无法真正帮助你:)
答案 1 :(得分:0)
答案是,循环的逻辑最好保持宗教和政治。您的default
确实是case 2
,这意味着case 2
实际上只是default
。尽管case 2
中default
中的某些执行可能并未在if
中发生,但您需要的极为罕见在default
案例中执行除switch
条件以外的任何操作。此外,在排除故障时,如果您向后循环案例链,则无法立即确定goto
评估的结果。想象一下你的堆栈跟踪。
有 次使用exception
,但这些通常在break
个案件中(看我在那里做了什么)你需要立即执行一个动作(例如在goto
运行条件或无限循环之前记录另一个线程上的错误。 :before
的一般规则与预处理器命令相同。如果有另一种方式可以做同样有效的事情,你应该使用另一种方式来保持逻辑连续性和可维护性。