Переключатель С#:случай, не подпадающий под ограничение других случаев
-
09-06-2019 - |
Вопрос
Этот вопрос является своего рода дополнением к этому вопрос
В 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
Решение
Часто, когда вы видите шум от огромного оператора switch или множества операторов if, которые могут попасть более чем в один блок, вы пытаетесь подавить плохой дизайн.
Вместо этого, что, если вы реализуете шаблон спецификации, чтобы увидеть, соответствует ли что-то, а затем действовать в соответствии с этим?
foreach(MonthSpecification spec in this.MonthSpecifications)
{
if(spec.IsSatisfiedBy(month))
spec.Perform(month);
}
затем вы можете просто добавить различные спецификации, соответствующие тому, что вы пытаетесь сделать.
Трудно сказать, какой у вас домен, поэтому мой пример может показаться немного надуманным.
Другие советы
В операторах переключения 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;
}
Вы добавляете константы?Если да, возможно, что-то вроде этого сработает (синтаксис C):
const int addToTotals[] = {123, 456, ..., 789};
for(i=month;i<12;i++)
totals += addToTotals[i];
Вы можете сделать то же самое с указателями на переменные или функции, если вам нужны более сложные инструкции, чем добавление константы к итоговым значениям за каждый последующий месяц.
-Адам
Уже был вопрос по этой теме:
Ограничения операторов переключения C# – почему?
РЕДАКТИРОВАТЬ:
Моя главная цель подчеркнуть это, благородные звери, состоит в том, чтобы два вопроса с почти одинаковыми названиями добавили путаницы в пул вопросов.
Запишите случаи переключения в обратном порядке
case 2:
case 1:
case 0:
break;
default:
Надеюсь, это поможет!