2009-11-25 115 views
0

我会切入正题。我有两个关于开关的问题很简单,但我无法弄清楚。c#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语句的常量?

谢谢!

编辑:

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

+0

作为一个不错的学术努力,我会鼓励你下载反射器,并看看你的switch语句被编译成什么。 – Josh 2009-11-25 04:03:46

回答

0

case语句的值绝对不需要连续。

你也没有绑定到只使用整数值。弦乐也一样。

如果您担心幻数,最好的办法是创建一个枚举。它会传达这些神奇数字的意义。否则,有它并享受。

0

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

1

他们可以以任何你想要的顺序。不,使用实际数字并不总是不好的。但不是幻数。如果你是一个比较int,如可能

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

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

0

顺序并不重要,编译器会为你做这个工作。

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

+0

取决于有关号码的目的。例如,我已经打开计数。我真的需要在这里列举吗? – 2009-11-25 04:03:33

0

它可以做到这一点。语法是这样的:(你接近)

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; 
} 

注意冒号和break秒。

至于神奇数字的使用,一般来说,我更喜欢将常量放在文字中,但我对明显的数字例外,例如检查因子可分性的最小数字是2。

+0

拿到了我的徽章!感谢downmod! :D – 2009-11-25 08:03:22

0

作为一种小型优化,您可以根据实际/预期频率对您的案例值进行排序。我还会添加一个“默认”的例子,这样你就可以很容易地发现你使用枚举的地方,并忘记解释它。这是使用枚举值而不是常量的另一个原因。

+0

我认为对于整数,所有分支都是恒定的时间,不管顺序如何。我没有来源,但有人确定吗? – recursive 2009-11-25 04:04:23