C#开关:案例不属于其他案例限制

时间:2020-03-05 18:50:10  来源:igfitidea点击:

这个问题是这个问题的一种添加

在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

解决方案

回答

已经有一个针对这个主题的问题:

Cswitch语句为什么会受到限制?

编辑:

我要指出的主要目的是,亲爱的野兽,是两个名字几乎相同的问题,这给问题集增加了混乱。

回答

很多时候,当我们看到巨大的switch语句或者许多if语句可能会陷入多个块的噪音时,我们试图抑制不良的设计。

相反,如果我们实现了规范模式以查看某项是否匹配,然后对其采取行动,该怎么办?

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

那么我们就可以添加与我们要执行的操作相匹配的不同规格。

很难说出域名是什么,因此我的示例可能有些人为。

回答

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

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

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

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

-亚当

回答

在Cswitch语句中,只有没有针对我们要通过的案例的语句时,我们才能通过案例

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

回答

以相反的顺序写开关盒

case 2:

case 1:

case 0:

break;

default:

希望有帮助!