2008-09-09 33 views
5

这个问题是怎么样的一个附加到这个questionC#开关:外壳不易脱落通过其他案件不限

在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 

回答

11

通常,当您看到来自巨大开关语句或许多可能落入多个块的语句的噪音时,您试图抑制不良设计。相反,如果你实现了规范模式来查看是否有匹配的东西,然后采取行动呢?

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

然后你可以添加不同的规格,以符合你想要做的。

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

1

已经有解决这一议题的问题:

C# switch statement limitations - why?

编辑:

我在指出这一点主要目的,gentlebeasts,是近乎相同名称的两个问题增加对问题池的混淆。

+0

是的......我在问题中承认了这一点.... – 2008-09-09 16:40:29

+1

我没有看到关系(除了标题)。问题44905是关于某些限制的起源。这个问题是关于如何克服一个特定的限制(甚至在其他问题中没有提到)。 – mweerden 2008-09-09 16:51:43

+2

如果您想指出标题存在问题,那么您可能不应该添加标签“重复”,而是更改标题或明确提及您认为存在问题。 – mweerden 2008-09-09 17:05:06

1

您是否添加常量?如果是这样,也许像这样的工作(C语法):

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

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

你可以做类似的事情有变量或函数指针,如果你需要比添加常数总计每月下面更复杂的语句。

- 亚当

7

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

写开关的情况下以相反的顺序

case 2: 

case 1: 

case 0: 

break; 


default: 

希望有帮助!