Как кодировать оператор switch для тестирования DialogResult и обеспечения логики провала - PullRequest
3 голосов
/ 16 марта 2011

Я получаю странные результаты, проверяя возвращаемое значение из функции. Этот код находится внутри цикла for:

DialogResult result = EvalReturnFromWS(returnMsg);
     switch (result)
     {
         case DialogResult.Yes:
         case DialogResult.No:
              continue;
         default:
              break;
     } 

Вот фрагмент из вызванной функции (в моем модульном тестировании я всегда нажимаю кнопку «да»):

DialogResult result = MessageBox.Show(mbText.ToString(), caption, button, icon);
switch (result)
    {
         case DialogResult.Yes:
              return DialogResult.Yes;
         case DialogResult.No:
              return DialogResult.No;
         case DialogResult.Cancel:
              return DialogResult.Cancel;
    }

Когда я нажимаю «Да», он возвращает DialogResult. Да, но обратно в вызывающем коде выполнение переходит ко второму случаю, который является «нет», и это делает продолжение, что я НЕ собираюсь делать.

В другом месте в StackOverflow я видел поток, в котором предлагается кодировать «провальный» случай, как у меня для DialogResult. Да, он может провалиться.

Короче говоря, если ДА, я хочу возобновить выполнение с помощью следующего оператора после окончания случая (-ов) переключения. То есть «провалиться».

РЕДАКТИРОВАТЬ - извините за путаницу. Да, верхний фрагмент находится внутри цикла for. Второй фрагмент находится внутри вызываемой функции (этот код выдает MessageBox.Show).

Ответы [ 2 ]

8 голосов
/ 16 марта 2011

Что вы хотите сделать, это поставить break; в DialogResult.Yes случае. Вы не хотите, чтобы это провалилось в этом случае.

 switch (result)
 {
     case DialogResult.Yes:
          break; //Leaves the switch statement and continues executing code
     case DialogResult.No:
          continue; //Moves to next iteration of loop
     default:
          break; //Leaves the switch statement and continues executing code
 }

Провал означает, что выполнение переходит от одного оператора case к следующему. Это не имеет никакого отношения к выполнению, оставляющему оператор switch. В вашем примере break; в default: выходит из этого блока кода (переключатель, а не цикл) и продолжает выполнение после оператора switch. Опять же, это не вырваться из внешнего цикла. Это связано с тем, что break; является ключевым словом в случаях переключения, которое останавливает дальнейшее выполнение блока вариантов переключения. Однако continue; продолжит цикл, потому что это не то, что используется в корпусе коммутатора.

Попробуйте запустить этот пример кода:

for (int i = 0; i < 3; i++) {
    switch (i) {
        case 0:
        case 2:
            continue;
        default:
            break;
    }
    Console.Out.WriteLine(i);
}

Будет выводиться только 1, поскольку для случаев i=0 и i=2 цикл продолжается. Для случая i=1 выполнение становится равным Console.Out.WriteLine(i);.

Редактировать
И, если вы хотите выйти из цикла изнутри вашего коммутатора, посмотрите этот вопрос: Выход из вложенного цикла

0 голосов
/ 16 марта 2011

Это в цикле? Это единственная причина, по которой я вижу, что вы используете «продолжить» после «Нет». Достаточно уверенно, если сложить варианты дел таким образом, что «Да» и «Нет» будут делать то же самое. Если вы хотите, чтобы «Да» просто «падал» после переключения, сделайте это

case DialogResult.Yes:
    break;
...