如何在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之后的空语句列表。控制无法进入该空语句列表,因为首先没有空语句列表。 声明清单直到案例2之后才开始。

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

C#通过要求每个开关部分的终点无法访问来强制执行不遵守规则。 切换部分不需要中断。 它可以在休息,返回,转到,继续,抛出或可检测到的无限循环中结束:

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

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


switch(n)
{
   case 1:
   case 2:
   case 3:
      // do something
      break;
   default:
      break;
}
链接地址: http://www.djcxy.com/p/84449.html

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

下一篇: Why does integer overflow on x86 with GCC cause an infinite loop?