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


How can I use more than one constant for a switch case in C#?

如何使用一个以上的常数作为开关箱C?从概念上讲,我在寻找这样的东西:

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


许多答案表明,"如果案件是空的,破产是合法的"。

这是不正确的。这是错误的思考方式。这是一种推理,就好像C是C,而不是C。在C中,每个case标签都有一个关联的语句列表,可能是空的,并且控件"falls through"在语句列表的末尾。C中没有这种情况。

在C中,开关由多个部分组成,每个部分有一个或多个大小写标签,每个部分有一个或多个语句。当你说

1
2
3
4
5
6
7
switch(x)
{
    case 1:
    case 2:
      M();
      break;
}

不是有两个开关段的情况,一个用于案例1,一个用于案例2,案例1的开关段为空,落入第二个块。这就是C中的情况,但C不是C。

在C中,本例中有一个开关部分。它有两个标签和一个语句列表。大小写标签之间没有空的语句列表;不能有,因为语句列表位于节中最后一个标签之后。让我重复一遍:这里没有一个空的语句列表。根本没有语句列表,甚至没有空的语句列表。

这一特征使我们能够清楚地说明C中的"失败总是非法的",句号。同样,控制"通过"不是从案例1的空语句列表进入案例2的情况。控制永远不会失败。控件不会通过这里,因为控件从未在案例1之后进入空语句列表。控件无法进入该空语句列表,因为首先没有空语句列表。语句列表在案例2之后才开始。

c在每个开关部分(包括最后一个)强制执行"禁止坠落"规则。这样就可以任意地重新排序开关部分,可能是通过机械工具,而不会在程序中引入语义更改。

C通过要求每个开关段的终点不可到达来强制执行不通过规则。开关段不必以中断结束。它可以以中断、返回、转到、继续、抛出或可检测的无限循环结束:

1
2
3
4
5
6
7
8
9
10
11
12
switch(x)
{
    case 1:
        while(true) M();
    case 2:
        return 123;
    case 3:
        throw new Exception();
    case 4:
        M();
        goto case 3;
}

以上都是合法的,没有休息。


1
2
3
4
5
6
7
8
9
10
switch(n)
{
   case 1:
   case 2:
   case 3:
      // do something
      break;
   default:
      break;
}


最接近C中贯穿开关箱的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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


你不,你用的是摔倒。

1
2
3
4
5
6
7
8
9
10
switch( n )
{
    case x:
    case y:
    case z:
        DoSomething( );
        break;
    case blah:
        break;
}


试试这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 2:块中没有代码时,这才有效。i


你可以这样做:

1
2
3
4
5
6
7
8
9
switch(n)
{
   case 1: case 2: case 3:    
       break;
   case 4:
       break;
   default:
       break;
}