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が返されますが、呼び出し元のコードに戻ると、実行は「いいえ」である2番目のケースに流れ、これは私が意図していない継続を行います。

StackOverflowの他の場所で、DialogResult.Yesのような「フォールスルー」ケースのコーディングを提案するスレッドを見ました。

つまり、YESの場合、switchcaseの終了後に次のステートメントで実行を再開したいと思います。つまり、「フォールスルー」です。

編集-混乱してすみません。はい、一番上のスニペットはforループの中にあります。2番目のスニペットは呼び出された関数内にあります(そのコードは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
 }

フォールスルーとは、実行が 1 つのcaseステートメントから次のステートメントに移動することを意味します。switchステートメントを残して実行することとは何の関係もありません。あなたの例では、break;underdefault:はそのコードブロック(ループではなくスイッチ)から抜け出し、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=0i=2i=1Console.Out.WriteLine(i);

編集
そして、スイッチ内からループから抜け出したい場合は、この質問を参照してください:ネストされたループから抜け出す

于 2011-03-16T20:05:35.453 に答える
0

これはループですか?これが、No の後に「continue」を使用しているのを目にする唯一の理由です。案の定、case オプションをそのように積み重ねることで、Yes と No は同じことを行います。切り替え後に「はい」を「通過」させたい場合は、これを行います

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