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

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

C# switch: case not falling through to other cases limitation

该问题是该问题的附加内容

在C#中,切换条件不能落入其他情况,这会导致编译错误。在这种情况下,我只是在所选月份的月份总数中添加一些数字,此后的每个后续月份中都会添加一些数字。 (简单的示例,并不意味着是真实的)

1
2
3
4
5
6
7
8
9
10
11
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语句?

1
2
3
4
5
6
7
if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc

通常,当您看到巨大的switch语句或许多if语句可能会落入多个块的噪音时,您试图抑制不良设计。

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

1
2
3
4
5
foreach(MonthSpecification spec in this.MonthSpecifications)
{
   if(spec.IsSatisfiedBy(month))
       spec.Perform(month);
}

然后您可以添加符合您要执行的操作的不同规格。

很难说出您的域名是什么,所以我的示例可能有些虚构。


在C#switch语句中,只有在没有要通过大小写的情况的语句时,才可以通过大小写进行大小写

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

但是,如果您想使用一条语句,则必须使用可怕的GOTO

1
2
3
4
5
6
7
switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }

您要添加常量吗?如果是这样,也许类似的东西会起作用(C语法):

1
2
3
4
const int addToTotals[] = {123, 456, ..., 789};

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

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

-亚当


已经有一个解决此主题的问题:

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

编辑:

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


以相反的顺序写开关盒

1
2
3
4
5
6
7
8
9
10
case 2:

case 1:

case 0:

break;


default:

希望有帮助!


推荐阅读