【问题标题】:c# switch statement questionc# switch语句问题
【发布时间】:2010-12-20 03:39:48
【问题描述】:

我会切入正题。我有两个关于 switch 的问题很简单,但我想不通。

第一:

在c# switch 语句中,case 语句是否必须是连续的(带有整数)?

例如:

switch(someInt)
{
    case 1
    // some code
    case 2
    // some code 
    case 3 
    // some code
}

或者是否可以执行以下操作:

switch(someInt)
{
    case 1 
    case 3
    case 5
}

我知道通常 if-else 语句用于类似的事情,但我只是想知道它是否可能。

另外,在 case 语句中使用实际数字是否被视为幻数?或者更好的做法是声明常量以在 case 语句中使用?

谢谢!

编辑:

感谢大家的回复!我很感激。

【问题讨论】:

  • 作为一项不错的学术活动,我鼓励您下载反射器并查看您的 switch 语句被编译成什么。

标签: c# switch-statement magic-numbers


【解决方案1】:

它们可以按您想要的任何顺序排列。不,使用实际数字并不总是坏事。但不是魔术数字。如果您要比较 int,请使用数字,例如

switch (numberOfItems) 
{  
    case 0:
      break;
    case 1:
      break;
    default:
      break;
}  

(当然,这只是一个例子,我无法想象在现实世界中看到这段代码)

【讨论】:

    【解决方案2】:

    case 语句的值肯定不需要是连续的。

    您也不仅仅局限于使用整数值。字符串也可以。

    如果您担心幻数,最好的办法是创建一个枚举。它将传达那些神奇数字的含义。否则,尽情享受吧。

    【讨论】:

      【解决方案3】:

      它们不必是连续的。虽然我这样做只是为了清楚起见。

      【讨论】:

        【解决方案4】:

        顺序无关紧要,编译器会为您完成这项工作。

        我更喜欢使用枚举或 const int 来为数字提供含义,尤其是当它由其他人维护时。

        【讨论】:

        • 取决于相关号码的用途。例如,我以前打开过计数。我真的需要在这里枚举吗?
        【解决方案5】:

        两者都可以。语法是这样的:(你很接近)

        switch(someInt)
        {
            case 1:
            // some code
            break;
        
            case 2:
            // some code 
            break;
        
            case 3:
            // some code
            break;
        
            default:
            // code for "else" case
            break;
        }
        or is it possible to do something like the following:
        
        switch(someInt)
        {
            case 1:
            case 3:
            case 5:
            // some code
            break;
        } 
        

        注意冒号和breaks。

        关于幻数的使用,一般来说,我更喜欢将字面量放在常量中,但我对明显的数字例外,例如检查因数可除性的最小数字是 2。

        【讨论】:

        • 拿到我的徽章了!感谢您的降级! :D
        【解决方案6】:

        作为一项小型优化,您可以根据实际/预期频率对案例值进行排序。我还将添加一个“默认”案例,这样您就可以轻松地发现您在哪里使用了您的枚举并且忘记了对其进行说明。这是在常量上使用枚举值的另一个原因。

        【讨论】:

        • 我认为对于整数,所有分支都是恒定的时间,无论顺序如何。我没有消息来源,但有人确定吗?
        猜你喜欢
        • 2018-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多