Как кодировать оператор переключателя для тестирования диаграммы и обеспечить падение через логику

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

Вопрос

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

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

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

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.yes, но обратно в вызовный код, выполнение переходит ко второму случаю, который «нет», и это делает продолжение, что я и не намерен.

В другом месте на Stackoverflow я увидел ветку, которая предлагает кодирование «пропавного» случая, как я имел для Dialogresult. Да, что они провалились.

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

Редактировать - извините за путаницу. Да, верхний фрагмент находится внутри петли. 2 -й фрагмент находится внутри функции CALL (этот код выпускает Messagebox.show.show).

Это было полезно?

Решение

То, что вы хотите сделать, это поместить 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; это ключевое слово в случаях переключения, которое останавливает дальнейшее выполнение блока корпуса Switch. Однако, 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);.

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

Другие советы

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

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