C# switch语句:case不能跳转到其他case的限制

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
5个回答

11

通常情况下,当你看到一个庞大的 switch 语句或者很多 if 语句会落在多个代码块中时,你可能在试图压制一种糟糕的设计。

相反,如果你实现了 Specification 模式来判断某些东西是否匹配,然后再对其进行操作呢?

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

那么,您只需添加符合您要求的不同规格即可。

很难确定您的领域,所以我的例子可能有点牵强。


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;
    }

2
为什么GOTO语句备受恐惧?此外,“goto case”的使用并不是“goto语句”。 - Ben Voigt
4
我认为使用“可怕的”这个词是合理的。我能很容易地想象程序员误用switch语句中的goto case,使其从一个case跳到另一个case,再回到原来的case。使用goto会导致代码混乱,混乱会引起恼怒,恼怒会带来痛苦。goto是通向黑暗面的道路。 - Ben

1
你正在添加常量吗?如果是的话,也许这样的代码(C语言)会有用:
const int addToTotals[] = {123, 456, ..., 789};

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

如果您需要比每个月添加常量更复杂的语句,可以使用变量或函数指针进行类似的操作。
-亚当

1

已经有一个问题在讨论这个主题:

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

编辑:

我指出这一点的主要目的,是因为两个几乎相同名称的问题会给问题池增加困惑。


1
除了标题之外,我看不出两者之间的关系。问题44905是关于某些限制的起源。而这个问题则是关于如何克服一个特定的限制(甚至在另一个问题中都没有提到)。 - mweerden
2
如果你想指出标题存在问题,也许就不应该添加一个“重复”的标签,而是要么修改标题,要么明确提到你认为存在问题。 - mweerden

0

将 switch case 按相反的顺序编写

case 2:

case 1:

case 0:

break;


default:

希望能有所帮助!

1
如果存在其他代码,则C#仍需要在case之间使用流程控制语句(break/continue/return/goto/goto case/throw)。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接