Как кодировать оператор переключателя для тестирования диаграммы и обеспечить падение через логику
-
26-10-2019 - |
Вопрос
Я получаю странные результаты, проверяющие возвратное значение из функции. Этот код находится внутри цикла:
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;