我在测试函数的返回值时遇到了奇怪的结果。这段代码在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.Yes但是回到调用代码中,执行流向第二个案例,即“no”,这是一个继续,这是我不打算。
在StackOverflow的其他地方,我看到了一个线程,暗示编写一个“堕落”的案例,就像我对DialogResult一样。是的。
简而言之,如果是,我想在切换案例结束后用下一个语句恢复执行。也就是说,“堕落”。
编辑 - 抱歉混淆。是的,顶部片段在for循环中。第二个片段在被调用的函数内(该代码发出MessageBox.Show)。答案 0 :(得分:8)
您要做的是将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);
。
修改强>
而且,如果您想要从交换机中退出循环,请参阅此问题:Breaking out of a nested loop
答案 1 :(得分:0)
这是一个循环吗?这是我可以看到你使用'继续'之后的唯一原因。当然,通过堆叠案例选项,Yes和No将做同样的事情。如果您希望“是”在切换后执行“直播”
case DialogResult.Yes:
break;