【问题标题】:Which is better?when using break or return in switch statement? [closed]哪个更好?在 switch 语句中使用 break 或 return 时? [关闭]
【发布时间】:2016-09-30 03:40:42
【问题描述】:

我想知道在 switch 语句中使用 break 或 return 时的区别。哪个更有效率?有人可以向我解释吗?非常感谢你。代码如下:

public void foo(){
    int i = 10;
    switch (i) {
        case 1: {
            //code here
            break;  //or return;
        }
        case 2: {
            //code here
            break;  //or return;
        }
        // code  code
        // code  code
        // code  code
        case 10:{
            //code here
            break;  //or return;
        }
        default:{
            //code here
            break;  //or return;
        }
    }
}

【问题讨论】:

  • 你的情况没有区别。在非 void 方法中,它们做不同的事情。
  • 我知道功能没有什么不同,但我想知道哪个更有效。
  • 为什么你认为一个更有效?即使假设存在性能差异,您问这个问题所花费的时间也比您想象的优化所节省的时间要多。找些更好的事情做。
  • 好的,谢谢,只是因为我的同事更改 break 以返回我的代码。所以我只想知道这是否更有效率。
  • 我会告诉你的同事不要再摆弄你的代码了。

标签: java switch-statement memory-efficient


【解决方案1】:

两者完全不同 - 试图在效率方面比较它们简直是荒谬的。 break 终止 switch 后续子句的执行,并在 switch 块之后继续执行。 return 终止当前方法的执行并将控制权返回给调用方法。它们唯一的共同点是代码不会失败以执行任何进一步的案例。

一般来说,我会警惕在 switch 语句中使用 return,不是因为对性能有任何影响,而是因为它使推理代码的行为变得有点困难。 (我还认为,Java 中的 switch 语句几乎从不需要,它在程序中的存在通常表明设计失败,但这是另一个问题)

【讨论】:

    【解决方案2】:

    在此示例中,含义或性能没有区别。在其他情况下,可能会有所不同......因为breakreturn 意思 不同的东西。 (如果两个结构在给定的上下文中意味着不同的东西,它们的表现可能会不同!)

    不过,风格上break 更好:

    1. 一般1,具有多个退出点(即多个显式和隐式return 语句)的方法更难理解。

    2. 在此示例中,假设您决定要更改方法以在 switch 语句之后执行某些操作 ....


    1 - 这是有争议的(见https://stackoverflow.com/a/4838892/139985),也有例外。但我会说它适用于这个例子。


    好的,谢谢,只是因为我的同事更改 break 以返回我的代码。所以我只想知道这样是否更有效率。

    我会请他们解释他们为什么这样做。关键是他们这样做可能是有充分理由的,或者是有争议的理由……或者是不正确的理由。如果他们出于不正确的原因这样做,他们需要了解他们的推理是不正确的,这样他们就不会在进行此类更改时浪费每个人的时间并可能在此过程中损坏代码库。

    【讨论】:

    • 非常值得商榷。就个人而言,我更喜欢在非 void 方法中的 switch 中多次返回,因为它可以缩短代码并减少样板。
    • 实际上,在这个例子中,它并没有保存 any 样板。由于breakreturn 少一个字符,因此使用break 可以>>节省
    • 这个例子不是非空方法。我的观点是,这是非常主观的,取决于具体情况。
    【解决方案3】:

    shmosel 适合您的情况。 但是如果你想说在 switch 语句中做一个操作并返回那个值,你就需要一个 return,因为你从 switch 中得到了一些东西。中断只是停止 Switch 的执行,因此不返回任何内容。

    两个不同版本之间的功效并没有真正的影响。他们只是表现得有点不同。占用的内存将是相似的。

    【讨论】:

      【解决方案4】:

      break 表示代码将退出当前块({ })并继续执行以下代码(如果有)。

      int i = 1;
         switch (i)
         {
            case 1: Console.WriteLine("1"); break;
            case 2: Console.WriteLine("2"); break;
            default: Console.WriteLine("..."); break;
         }
      
         Console.ReadLine();
      

      在上述情况下,控制台将等待用户输入,因为它能够到达Console.ReadLine();

      int i = 1;
      
         switch (i)
         {
            case 1: Console.WriteLine("1"); return;
            case 2: Console.WriteLine("2"); break;
            default: Console.WriteLine("..."); break;
         }
      Console.ReadLine();
      

      对于上面的情况,程序不会执行任何后面的代码,并且当int i为1时它永远不会到达Console.ReadLine()

      您可以通过调试它们清楚地看到它们的行为。

      【讨论】:

      • 这是什么语言?
      • 他使用了javascript语言
      猜你喜欢
      • 2011-03-12
      • 2011-05-23
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2011-11-14
      相关资源
      最近更新 更多