使用goto从一个案例落到另一个案例

时间:2017-04-19 13:40:49

标签: c# unity3d switch-statement goto

我已经阅读了多篇文章,说使用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或者说他们只是听说过从未使用过它。所以我来到这里是为了得到明确的答案。我正在寻找答案解释或指向其中的链接。 谢谢,

2 个答案:

答案 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 2default中的某些执行可能并未在if中发生,但您需要的极为罕见在default案例中执行除switch条件以外的任何操作。此外,在排除故障时,如果您向后循环案例链,则无法立即确定goto评估的结果。想象一下你的堆栈跟踪。

次使用exception,但这些通常在break个案件中(看我在那里做了什么)你需要立即执行一个动作(例如在goto运行条件或无限循环之前记录另一个线程上的错误。 :before的一般规则与预处理器命令相同。如果有另一种方式可以做同样有效的事情,你应该使用另一种方式来保持逻辑连续性和可维护性。