Переключатель С#:случай, не подпадающий под ограничение других случаев

StackOverflow https://stackoverflow.com/questions/52313

  •  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:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top