5

这个问题是这个问题的附加问题

在 C# 中,一个 switch case 不能落入其他 case,这会导致编译错误。在这种情况下,我只是在所选月份以及之后的每个月份的月份总数中添加一些数字。(简单的例子,并不意味着是真实的)

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
4

5 回答 5

11

很多时候,当你看到一个巨大的 switch 语句或许多可能落入多个块的 if 语句的噪音时,你是在试图压制一个糟糕的设计。

相反,如果您实现规范模式以查看是否匹配,然后采取行动呢?

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

然后您可以添加与您尝试执行的操作相匹配的不同规格。

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

于 2008-09-09T16:40:09.113 回答
8

在 C# switch 语句中,只有当没有您想要通过的案例的语句时,您才能通过案例

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;
    }
于 2008-09-09T17:18:43.187 回答
1

已经有一个问题解决了这个主题:

C# switch 语句限制 - 为什么?

编辑:

绅士们,我指出这一点的主要目的是,两个名称几乎相同的问题给问题池增加了混乱。

于 2008-09-09T16:37:24.083 回答
1

你在添加常量吗?如果是这样,也许这样的事情会起作用(C语法):

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

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

如果您需要更复杂的语句而不是在接下来的每个月的总计中添加常量,您可以使用变量或函数指针执行类似的操作。

-亚当

于 2008-09-09T16:42:42.573 回答
0

以相反的顺序编写开关案例

case 2:

case 1:

case 0:

break;


default:

希望有帮助!

于 2010-04-01T23:45:41.977 回答