2011-03-16 4 views
3

을 통해 가을 DialogResult를 테스트하고 제공하는 스위치 문을 코딩하는 방법. 이 코드는 루프에 대한 내부 : 예 "나는 함수의 반환 값을 테스트하는 이상한 결과를 얻고 논리

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 result = EvalReturnFromWS(returnMsg); 
    switch (result) 
    { 
     case DialogResult.Yes: 
     case DialogResult.No: 
       continue; 
     default: 
       break; 
    } 

이 (내 단위 테스트에 난 항상"예 "버튼을 클릭) 호출 된 함수에서 조각입니다 "그것은 DialogResult를 반환합니다. 그렇지만 호출 코드에서 다시 실행은"아니오 "인 2 번째 사례로 넘어 가고 이것이 계속 의도하지 않는 것입니다.

은 다른 곳에 StackOverflow에, 나는 DialogResult.Yes 통해 가을에 봉사 할 것입니다 위해이 같은 제안에 "가을 스루"사건을 코딩하는 스레드를 보았다. 한마디로

는 경우 YES, I는 스위치 케이스 (들)의 종료 후 다음 문을 실행을 다시 시작하고 싶다. 즉, "넘어져"있습니다.

편집 - 혼란스러워합니다. 예, 상단 스 니펫은 for 루프 안에 있습니다. 두 번째 스 니펫은 호출 된 함수 안에 있습니다 (이 코드는 MessageBox.Show를 발행합니다). 당신이 원하는 무엇

+1

두 번째 스 니펫이 '결과를 반환'하지 못하는 이유는 무엇입니까? 또는 적어도 Yes 또는 No 또는 Cancel 인 경우 'return result'? – BoltClock

+0

흠, 혼란 스럽네. switch 구문과 관련하여 "fall trough"는 switch 문을 종료하지 않고 다음 사례로 넘어가는 것을 의미합니다. – steinar

+0

'switch' 문맥에서, "fall through"는 "하나의'case'에서 다음으로 넘어 간다"는 것을 의미합니다."switch"다음에 다음 명령문으로 실행을 다시 시작한다는 의미라면 "break"라고 말해야합니다. – AakashM

답변

8

DialogResult.Yes 경우 break;을 배치됩니다. 당신은이 경우에 빠지기를 원하지 않습니다.

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;이 스위치 케이스 내에서 스위치 케이스 블록의 추가 실행을 중지시키는 키워드이기 때문입니다. 그러나 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

문제의 EDIT를 참조하십시오 ... 첫 번째 스 니펫은 for 루프 안에 있습니다. 반환이 DialogResult 인 경우를 통해 내리고 싶습니다. 예 –

+0

@ John Galt : "fall through"의 의미를 정의 해 주시겠습니까? 나는 당신이 올바른 맥락에서 그것을 사용하고 있다고 생각하지 않는다. fall through는 하나의 case 문에서 나온 코드가 다음 case로 이동한다는 것을 의미합니다. 그것은'switch' 문을 남겨둔 실행과 아무 관련이 없습니다. 귀하의 예제에서,'default :'에있는'break;'는 (루프가 아닌) 그 코드 블록에서 빠져 나오고'switch' 문 다음에 실행을 계속합니다. 다시 말하지만 외부 루프에서 빠져 나오지 않습니다. 그러나'continue;는'switch' 내에서 사용되는 키워드가 아니므로 루프를 계속합니다. –

+0

또한 루프에서 실제로 벗어나는 방법에 대해서는 제 편집을 참조하십시오. –

0

이 루프에서인가를? 그것이 내가 '계속'을 사용하는 것을 볼 수있는 유일한 이유입니다. 물론 그렇습니다. 아니요 같은 방식으로 케이스 옵션을 스태킹하면됩니다. 전환 후 '예'를 '전환 후'로 설정하려면

case DialogResult.Yes: 
    break; 
+0

질문에 EDIT를 참조하십시오 ... 첫 번째 스 니펫은 for 루프 안에 있습니다. 스위치 안의 휴식은 for 루프에서 벗어날 것이라고 생각했습니다. 스위치 케이스에서 벗어난 것일 수도 있습니다. –

관련 문제