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

Ken*_*hou 7 c#

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

switch(n)
{
   case 1,2,3:     //????
   case 4:
   default:
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 36

许多答案都表示,"如果案件是空的,则可以合法审理".

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

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

switch(x)
{
    case 1:
    case 2:
      M();
      break;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

C#通过要求每个交换机部分的端点不可达来强制执行无掉落规则.开关部分不必在休息时结束.它可以以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;
}
Run Code Online (Sandbox Code Playgroud)

以上所有都是合法的; 没有休息.

  • 这是迂腐的,但不仅仅是*迂腐. (12认同)
  • 谢谢很好的解释. (2认同)

drh*_*ris 15

switch(n)
{
   case 1:
   case 2:
   case 3:
      // do something
      break;
   default:
      break;
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*ana 7

c#中最接近的开关案例:

switch(n)
{
   case 1:
      // Do something
      goto case 2;
   case 2:
      // Do something
      goto case 3;
   case 3:
      // Do something
     break;
  default:
     break;
}
Run Code Online (Sandbox Code Playgroud)

有关详情,请参阅此处:

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


Ed *_* S. 5

你没有,你使用直通.

switch( n )
{
    case x:
    case y:
    case z:
        DoSomething( );
        break;
    case blah:
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果箱体是空的,则允许直通. (5认同)
  • @Ed:这不合法.你不能拥有任何空的开关盒体,即使是最后一个.每个交换机部分的终点必须是不可达的. (3认同)
  • @Mehrdad喜欢删除评论,让你看起来有点疯狂.;) (2认同)