如何在C#中为一个开关盒使用多个常量?

如何为开关盒C#使用多个常量? 从概念上讲,我正在寻找这样的东西:

switch(n) { case 1,2,3: //???? case 4: default: } 

你没有,你使用直通。

 switch( n ) { case x: case y: case z: DoSomething( ); break; case blah: break; } 

许多答案都表示,如果案件是空的,那么“失败是合法的”。

这是不正确的。 这是错误的思考方式。 这就是推理,好像C#是C,但事实并非如此。 在C中,每个case标签都有一个关联的语句列表,可能是空的,并且控制“掉落”在语句列表的末尾。 在C#中没有这种情况。

在C#中,交换机由许多部分组成 ,每个部分都有一个或多个案例标签 ,每个部分都有一个或多个语句 。 当你说

 switch(x) { case 1: case 2: M(); break; } 

不是有两个开关部分的情况,一个用于壳体1,一个用于壳体2,并且用于壳体1的开关部分是空的并且落到第二块。 这将是C中的情况,但C#不是C.

在C#中,在这个例子中有一个开关部分。 它有两个标签和一个声明列表。 案例标签之间没有空的陈述列表; 不可能,因为语句列表遵循该部分中的最后一个标签 。 让我再说一遍:那里不存在空语句列表。 根本没有语句列表, 甚至没有空语句列表

这种描述使我们能够清楚地说明C#中的“通过永远非法的 ”期间的落空规则。 同样,情况并非如果控制从案例1的空语句列表“落入”到案例2中。控制永远不会失败。 控制不会在这里落空,因为控件永远不会在案例1之后进入空语句列表 。 Control无法输入该空语句列表,因为首先没有空语句列表 。 声明列表直到案例2之后才开始。

C#在每个交换机部分中强制执行no-fall-through规则,包括最后一个。 这样可以通过机械工具任意地重新排序开关部分,而不会在程序中引入语义变化。

C#通过要求每个交换机部分的端点无法访问来强制执行无掉落规则。 开关部分不必以rest结束。 它可以以break,return,goto,continue,throw或可检测的无限循环结束:

 switch(x) { case 1: while(true) M(); case 2: return 123; case 3: throw new Exception(); case 4: M(); goto case 3; } 

以上所有都是合法的; 没有rest。

 switch(n) { case 1: case 2: case 3: // do something break; default: break; } 

在c#中通过切换案例最接近的事情:

 switch(n) { case 1: // Do something goto case 2; case 2: // Do something goto case 3; case 3: // Do something break; default: break; } 

有关详情,请参阅此处:

http://msdn.microsoft.com/en-us/vcsharp/aa336815.aspx

试试这个:

 switch(n) { case 1: case 2: case 3: //Do Stuff break; case 4: //Do more stuff break; default: //Do standard stuff break; } 

请记住,只有在case 1:没有代码时才会有效case 1:case 2: blocks.i

你可以这样做:

 switch(n) { case 1: case 2: case 3: break; case 4: break; default: break; }