C#开关:案件没有落到其他案件限制

时间:2008-09-09 16:36:19

标签: c# switch-statement

此问题是此question

的附加内容

在C#中,交换机案例无法通过其他情况,这会导致编译错误。在这种情况下,我只是在所选月份和之后的每个月的总月份中添加一些数字。 (简单的例子,并不意味着真实)

switch (month)
{
    case 0:
      add something to month totals
    case 1:
      add something to month totals
    case 2:
      add something to month totals
    default:
      break;
}

在C#中是否有合理的替代方法而不必写出大量的if语句?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc

5 个答案:

答案 0 :(得分:11)

通常,当您看到来自巨大的switch语句的噪音或许多可能属于多个块的if语句时,您试图抑制错误的设计。

相反,如果你实现规范模式以查看某些内容是否匹配,然后对其采取行动呢?

foreach(MonthSpecification spec in this.MonthSpecifications)
{
   if(spec.IsSatisfiedBy(month))
       spec.Perform(month);
}

然后您可以添加与您尝试的内容相匹配的不同规格。

很难说出你的域名是什么,所以我的例子可能有点人为。

答案 1 :(得分:8)

在C#转换语句中,只有在您想要通过的案例没有声明的情况下才可以通过案例

switch(myVar)
{
   case 1:
   case 2: // Case 1 or 2 get here
      break;
}

但是如果你想要声明你必须使用可怕的GOTO

switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }

答案 2 :(得分:1)

已经有一个问题涉及这个主题:

C# switch statement limitations - why?

编辑:

我的主要目的是指出,温柔的,有两个相同名称的问题会给问题池增加混乱。

答案 3 :(得分:1)

你在添加常量吗?如果是这样,也许这样的东西可以工作(C语法):

const int addToTotals[] = {123, 456, ..., 789};

for(i=month;i<12;i++)
   totals += addToTotals[i];

如果你需要更复杂的语句而不是为每个月的总数添加常量,你可以对变量或函数指针做类似的事情。

- 亚当

答案 4 :(得分:0)

以相反的顺序写开关案例

case 2:

case 1:

case 0:

break;


default:

希望有所帮助!