【问题标题】:How to code a switch statement to test DialogResult and provide fall through logic如何编写 switch 语句来测试 DialogResult 并提供失败逻辑
【发布时间】:2011-07-16 21:49:27
【问题描述】:

我在测试函数的返回值时得到了奇怪的结果。此代码在 for 循环中:

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

这是来自被调用函数的 sn-p(在我的单元测试中,我总是单击“是”按钮):

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) 结束后继续执行下一条语句。也就是“落空”。

编辑 - 很抱歉造成混淆。是的,顶部的 sn-p 在 for 循环内。第二个 sn-p 在被调用函数内(该代码发出 MessageBox.Show)。

【问题讨论】:

  • 为什么你的第二个 sn-p 不能只是 return result?或者至少,如果是、否或取消,return result?
  • 嗯,我很困惑。 switch 语句上下文中的“跌倒”意味着您“跌倒”到下一个案例,而不是退出 switch 语句。
  • switch 语句的上下文中,“失败”非常具体地表示“从一个case 传递到下一个”。如果你想说“在switch 之后的下一条语句继续执行”,你应该说“break”。

标签: c# winforms switch-statement messagebox dialogresult


【解决方案1】:

您要做的是将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 语句的执行无关。在您的示例中,default: 下的 break; 会跳出该代码块(开关,而不是循环)并在 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,因为对于i=0i=2 的情况,循环会继续。对于i=1 的情况,执行将变为Console.Out.WriteLine(i);

编辑
而且,如果您想从交换机内部跳出循环,请参阅以下问题:Breaking out of a nested loop

【讨论】:

  • 请参阅编辑问题...第一个 sn-p 在 for 循环内。如果返回是 DialogResult.Yes,我想通过
  • @John Galt:你能定义一下你所说的“跌倒”是什么意思吗?我认为您没有在正确的上下文中使用它。失败意味着来自一个case 语句的代码移动到下一个语句。它与离开switch 语句的执行无关。在您的示例中,default: 下的 break; 跳出该代码块(不是循环)并在 switch 语句之后继续执行。同样,它不会脱离外循环。但是,continue; 将继续循环,因为它不是在 switch 中使用的关键字。
  • 另外,请参阅我的编辑以了解如何真正跳出循环。
  • @John Galt:我再次对其进行了编辑,并给出了更详尽的解释和示例。希望对您有所帮助。
【解决方案2】:

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

case DialogResult.Yes:
    break;

【讨论】:

  • 请参阅编辑问题...第一个 sn-p 在 for 循环内。我认为 switch 内部的 break 会跳出 for 循环。也许您是说它只是脱离了开关盒?
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多