Переключатель C #: случай, не выходящий за пределы других случаев - PullRequest
5 голосов
/ 09 сентября 2008

Этот вопрос является своего рода дополнением к этому вопросу

В 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

Ответы [ 5 ]

11 голосов
/ 09 сентября 2008

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

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

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

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

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

8 голосов
/ 09 сентября 2008

В операторах переключения 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;
    }
1 голос
/ 09 сентября 2008

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

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

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

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

-Adam

1 голос
/ 09 сентября 2008

В этой теме уже есть вопрос:

Ограничения оператора C # - почему?

EDIT:

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

0 голосов
/ 02 апреля 2010

Запишите случаи переключения в обратном порядке

case 2:

case 1:

case 0:

break;


default:

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

...