2011-03-16 28 views
3

我得到了奇怪的結果,它測試函數的返回值。此代碼是在for循環:如何編寫switch語句來測試DialogResult並提供邏輯落空

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的其他地方,我看到一個線程提示編寫一個「fall-through」的例子,就像我爲DialogResult.Yes所做的那樣。

總之,如果是,我希望在開關盒結束之後繼續執行下一個語句。那就是「通過」。

編輯 - 抱歉混淆。是的,頂部代碼片段在for循環中。第二個片段位於被調用的函數內(該代碼發出MessageBox.Show)。

+1

爲什麼不能你的第二個片段只是'返回結果'?或者至少,如果是或否或取消,返回結果? – BoltClock 2011-03-16 20:04:23

+0

恩,我很困惑。在switch語句的語境中,「fall tr​​ough」意味着你「落井下石」到下一個案例,而不是你退出switch語句。 – steinar 2011-03-16 20:08:50

+0

在'switch'語句的上下文中,「fall through」意思是「從一個'case'轉到下一個」。如果你的意思是「用'switch'後面的下一個語句繼續執行」,你應該說「break」。 – AakashM 2011-03-16 20:10:36

回答

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聲明無關。在您的示例中,default:下的break;跳出該代碼塊(開關,而不是循環),並在switch語句後繼續執行。同樣,它不會突破外部循環。這是因爲break;是切換案例中的一個關鍵字,它會停止進一步執行切換案例塊。但是,continue;將繼續循環,因爲它不是在開關盒中使用的。

嘗試運行此示例代碼:

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

它只會因爲案件i=0i=2輸出1,繼續循環。對於i=1的情況,執行時間爲Console.Out.WriteLine(i);

編輯
而且,如果你想從你的交換機內跳出圈外,看到了這個問題:Breaking out of a nested loop

+0

請參閱編輯問題......第一個片段位於for循環中。如果返回結果是DialogResult,我想要通過。是的 – 2011-03-16 20:52:09

+0

@John Galt:您能否定義「fall through」的含義?我認爲你沒有在正確的背景下使用它。通過意味着來自一個'case'語句的代碼移到下一個代碼。它與執行'switch'語句無關。在你的例子中,'default:'下的'break;'突破了代碼塊(不是循環),並在'switch'語句後繼續執行。同樣,它不會突破外部循環。然而,'continue;'會繼續循環,因爲它不是'switch'中使用的關鍵字。 – 2011-03-16 21:15:44

+0

此外,請參閱我的編輯以瞭解如何實際跳出循環。 – 2011-03-16 21:16:18

0

這是一個循環?這是我能看到你使用'繼續'之後唯一的理由。果不其然,通過堆疊案例選項,Yes和No會做同樣的事情。如果你想'是'只是'跌落'後切換這樣做

case DialogResult.Yes: 
    break; 
+0

請參閱編輯上的問題......第一個片段位於for循環中。我認爲開關內部的斷開會跳出for循環。也許你是說它剛剛脫離開關櫃? – 2011-03-16 20:55:06