如何在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; }
有关详情,请参阅此处:
试试这个:
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; }