2008-09-09 72 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: 

希望有幫助!