2008-09-09 5 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 (month <= 0) 
    add something to month 
if (month <= 1) 
    add something to month 
if (month <= 2) 
    add something to month 
.... etc 

ответ

11

Часто, когда вы видите шум от огромного оператора switch или многих операторов if, которые могут попадать в более чем один блок, вы пытаетесь подавить плохой дизайн.

Вместо этого, если вы внедрили шаблон спецификации, чтобы увидеть, если что-то согласовано, а затем действовать на нем?

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

то вы можете просто добавить различные спецификации, которые соответствуют тому, что вы пытаетесь сделать.

Трудно сказать, что такое ваш домен, поэтому мой пример может быть немного надуманным.

1

Существует уже вопрос решения этой теме:

C# switch statement limitations - why?

EDIT:

Моя главная цель, указывая, что из, gentlebeasts, что два вопроса почти идентичным названием добавьте путаницу в пул вопросов.

+0

Да ... Я признал это в вопросе .... – 2008-09-09 16:40:29

+1

Я не вижу отношения (кроме названия). Вопрос 44905 посвящен истокам определенных ограничений. Этот вопрос касается того, как преодолеть одно конкретное ограничение (что даже не упоминается в другом вопросе). – mweerden 2008-09-09 16:51:43

+2

Если вы хотите указать, что есть проблема с заголовком, то, возможно, вам не следует добавлять тег `duplicate`, но либо изменить заголовок, либо явно указать, что вы считаете, что есть проблема. – mweerden 2008-09-09 17:05:06

1

Вы добавляете константы? Если это так, возможно, что-то подобное будет работать (C синтаксис):

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

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

Вы можете сделать подобную вещь с переменными или указателями на функции, если вам нужны более сложные операторы чем добавить константу к итогам каждого месяца, следующему.

-Adam

7

В заявлениях # коммутаторе C можно провалиться случаях, только если нет заявления на случай, если вы хотите, чтобы провалиться

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: 

Надеюсь, что это поможет!