3

我在测试函数的返回值时得到了奇怪的结果。此代码位于 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 但回到调用代码中,执行流向第二种情况,即“否”,这会继续,这是我不想要的。

在 StackOverflow 的其他地方,我看到一个线程建议像我为 DialogResult.Yes 编写的“失败”案例进行编码。

简而言之,如果是,我想在 switch case(s) 结束后使用下一条语句继续执行。也就是“落空”。

编辑 - 很抱歉混淆。是的,最上面的代码片段在 for 循环中。第二个片段位于被调用函数内(该代码发出 MessageBox.Show)。

4

2 回答 2

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
 }

Fall through 意味着执行从一个case语句移动到下一个语句。switch它与执行离开语句无关。在您的示例中,break;under default:, 打破了该代码块(开关,而不是循环)并在switch语句之后继续执行。同样,它不会脱离外循环。这是因为break;是 switch case 中的一个关键字,它停止了 switch case 块的进一步执行。但是,continue;将继续循环,因为它不是在 switch 案例中使用的东西。

尝试运行此示例代码:

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

它只会输出1,因为对于 casei=0i=2,循环会继续。对于案例i=1执行,使其成为Console.Out.WriteLine(i);.

编辑
并且,如果你想从你的开关中跳出循环,请看这个问题:Breaking out of a nested loop

于 2011-03-16T20:05:35.453 回答
0

这是在循环吗?这是我看到您在否后使用“继续”的唯一原因。果然,通过以“是”和“否”的方式堆叠案例选项将做同样的事情。如果您希望“是”在切换后只是“失败”,请执行此操作

case DialogResult.Yes:
    break;
于 2011-03-16T20:07:13.353 回答