C # переключатель / прерывание

Похоже, мне нужно использовать разрыв в каждом блоке case в моем операторе switch с использованием C #.

Я вижу причину этого в других языках, где вы можете перейти к следующему оператору case.

Могут ли блоки кейсов переходить в другие блоки кейсов?

Большое спасибо, очень признателен!


person Russell    schedule 25.11.2009    source источник


Ответы (4)


Да, вы можете перейти к следующему блоку дел двумя способами. Вы можете использовать пустые кейсы, для которых не нужен перерыв, или вы можете использовать goto для перехода к следующему (или любому) кейсу:

switch (n) {
  case 1:
  case 2:
  case 3:
    Console.WriteLine("1, 2 or 3");
    goto case 4;
  case 4:
    Console.WriteLine(4);
    break;
}
person Guffa    schedule 25.11.2009
comment
Пустые операторы case недопустимы, и case 1 этому не препятствует. См. Объяснение Эрика Липперта, а также мой комментарий, в котором упоминается, почему различие не является педантичным. Сообщая людям, что пустые блоки case являются законными, заставляет их делать ошибки. - person Brian; 10.11.2011
comment
@Brian: Можете называть это как-нибудь, если хотите, но приведенный выше код совершенно законен. Строго технически код, конечно, не будет реализован в виде серии блоков кода, через которые вы провалитесь, но это не относится к любому языку, и то же самое можно сказать о большинстве управляющих структур. Ошибка, на которую вы ссылаетесь, вообще не связана с пустыми регистрами (или как вы хотите их называть), поскольку он не пустой. - person Guffa; 10.11.2011

Применение «взлома» предназначено для того, чтобы остановить ошибки. Если вам нужно форсировать падение, используйте "goto case" (замените на соответствующее значение)

в следующем примере показано, что вы можете сделать:

switch(n)
{
    case 1:
    case 2:
      //do something for 1+2
      //...
      goto case 3;
    case 3:
      //do something for 3, and also extra for 1+2
      //...
      break;
    default:
      //do something for all other values
      //...
      break;
}

См. http://msdn.microsoft.com/en-us/library/06tc147t%28VS.80%29.aspx

person Will    schedule 25.11.2009
comment
Если он не поддерживает провал, значит, ошибки нет. Независимо от того, есть ли разрыв или нет, если язык не поддерживает провал, он не поддерживает его, чистая прибыль. Применение break; во время компиляции не предохраняет вас от случайного провала, потому что, как вы сказали, провал даже не поддерживается, поэтому такая авария не может произойти ... - person AaronLS; 06.05.2014

C # не поддерживает неявную сквозную конструкцию, но break (или goto), тем не менее, должен присутствовать (msdn). Единственное, что вы можете сделать, - это складывать кейсы следующим образом:

switch(something) {
    case 1:
    case 2:
      //do something
      break;
    case 3:
      //do something else
}

но этот break (или другой оператор перехода, такой как goto) просто должен быть там.

person Marek Karbarz    schedule 25.11.2009
comment
Это не совсем так. Дело не в том, что оператор перехода (под которым, я полагаю, вы имеете в виду break, continue, goto, return или throw) должен быть в конце, а в конце должен быть оператор с недостижимой конечной точкой. Все операторы перехода имеют это свойство, но есть и другие операторы с этим свойством. Например, совершенно законно, хотя и редко, завершать раздел switch с помощью while (true) M (); - person Eric Lippert; 25.11.2009
comment
Я вижу, что документация MSDN неверна. Поговорим с менеджером документации. - person Eric Lippert; 25.11.2009

В моем коде C # (.NET 1.1, CF) разрешены оба варианта:

switch (_printerChoice) 
{
    case BeltPrintersEnum.ZebraQL220: 
        return new ZebraQL220Printer();
        break;
    case BeltPrintersEnum.ONeal: 
        return new ONealPrinter();
        break;
    default:            
        return new ZebraQL220Printer();         
                        break;  
}

switch (_printerChoice) 
{
    case BeltPrintersEnum.ZebraQL220: 
        return new ZebraQL220Printer();
    case BeltPrintersEnum.ONeal: 
        return new ONealPrinter();
    default:            
        return new ZebraQL220Printer();         
}

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

person B. Clay Shannon    schedule 26.07.2013
comment
Оператор return (а также выдача исключений) заставляет код покинуть весь метод, поэтому следующий оператор break в этом случае не нужен. Больше нет структуры переключателей, которую можно было бы оставить. - person Udontknow; 21.11.2016