2012-03-14 10 views
4

C#のswitch文の中で条件的に脱出することができたのかしらと思いました。次の例を考えてみましょう。条件がtrueの場合スイッチケース内の条件付きブレーク

MediaStream photoMediaStream = null; 
switch (photoSize) 
{ 
    case PhotoSize.Normal: 
     if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth}); 
      break; 
     } 
    case PhotoSize.Small: 
     if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth}); 
      break; 
     } 
    case PhotoSize.Thumb: 
     if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth}); 
      break; 
     } 
} 

は基本的に、私が何かをして、switch文から抜け出すにしたいが、私はちょうど次のケースにフォールスルーしたくない場合。

+0

は、あなたはそれを試してみましたか?結果は何でしたか? – xbonez

+0

'photoSize == PhotoSize.Normal'た場合や' if'は、他のケースのどれもとにかく有効ではないだろうきっと失敗しますか? –

+0

うん、申し訳ありません。私は、 "コントロールが1つのケースラベルから別のケースラベルに落ちることはできません"というそれぞれのケースステートメントのコンパイルエラーを受け取りました。 – Kyle

答えて

7

暗黙のうちに次のケースに進むことはできないので、gotoステートメントを使用して明示的に行う必要があります。あなたがあれば、まあ

MediaStream GetPhotoMediaStream(PhotoSize photoSize, /* whatever parameters you need... */) 
{ 
    if (photoSize == PhotoSize.Normal) 
    { 
     if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0) 
     { 
      return photoMedia.GetStream(new MediaOptions {Width = NormalWidth}); 
     } 
     photoSize = PhotoSize.Small; 
    } 
    if (photoSize == PhotoSize.Small) 
    { 
     if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0) 
     { 
      return photoMedia.GetStream(new MediaOptions {Width = SmallWidth}); 
     } 
     photoSize = PhotoSize.Thumb; 
    } 
    if (photoSize == PhotoSize.Thumb) 
    { 
     if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0) 
     { 
      return photoMedia.GetStream(new MediaOptions {Width = ThumbWidth}); 
     } 
    } 
    return null; 
} 
+0

if' 'の使用や'/else'がはるかにきれいであるならば、私はその後、他の方法を持っていない使用方法で、 'swithch/case'を使用するように私の自己を制限するには、'私は私が得る認めなければならない、 – Tigran

+1

感謝をgoto' gotoの正当な使用について興奮している。これを私のコードに入れるのを待つことはできません。 – Kyle

1

C#は、いずれかのコードが間にあるときにケースラベルを囲むことをサポートしていません(Switch statement fallthrough in C#?参照)。
したがって、条件付きでブレークすることもできますが、各ブロックの最後にも分割する必要があります.-)

代わりにifsを使用してください。

1

いいえ、if条件が満たされないと、プログラムがあるケースから次のケースに流れる必要があります(これはC#では許可されていません)。 MSDNから

ジャンプ文が到達するまで、選択セクションのステートメントリストの

実行は、そのようなブレークとして、 でステートメントリストによる最初の文と進行し、一般的に を開始します場合によっては が返されます。を投げてください。その時点で、制御はswitchステートメントの外側または別のケースラベルに転送されます。

C++とは異なり、C#では、1つのスイッチ セクションから次のまで実行を続行できません。

2

いいえ、C#ではケース間にコードがない場合を除いてスイッチでフォールスルーを許可しません。スイッチ部のステートメントリストの終了点が到達可能である

場合は、コンパイル時エラーが発生します。 は、C#の仕様のポイント8.7.2を参照してください。

+0

C#が暗黙の** **フォールスルーを許可していませんが、明示的に...(ええ、私は知っている、後藤は悪である)goto' ' –

+0

感謝を使ってそれを行うことができます。これは私が混乱しているところだと思います。なぜなら、過去にスイッチのステートメントを使用していたからです。 – Kyle

+0

@Thomasレベスク:そういえば、私は後藤case'どこかで 'について読んが、私はそれを必要としないため、それ以来、それについて忘れてしまいました。 –

0

:これは、おそらくifステートメントを使用して、それをリファクタリングする方が良いだろう、とにかく...

MediaStream photoMediaStream = null; 
switch (photoSize) 
{ 
    case PhotoSize.Normal: 
     if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth}); 
      break; 
     } 
     goto case PhotoSize.Small; 
    case PhotoSize.Small: 
     if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth}); 
      break; 
     } 
     goto case PhotoSize.Thumb; 
    case PhotoSize.Thumb: 
     if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth}); 
      break; 
     } 
} 

この文の使用が許容されるまれなケースの一つであります関数内でコードの実行を条件付けする必要があります。switch/caseではなく、ifステートメントチェーンを使用してください。実行フローを「中断」したい場合は、returnを使用します。

0

他にも述べたように、C#ではフォールスルーが許可されていません。それは、ケースの積み重ねを許可しますが、それはあなたを助けるつもりはありません。ただし、if条件の外でgoto文を使用すると、明示的に別の(またはあなたの場合の)次のケースに制御を移すことができます。誰かの前に

はOMG」と言っ!! eww ... goto! '、私は、gotosの使用を正当化する事例はほとんどないと付け加えなければならない。これはそれらの1つと考えられます。誤用されていない限り、本質的にはgotosに間違いはありません。

2

あなたはgoto caseで、他の場合に行くことができます。

switch (photoSize) 
{ 
    case PhotoSize.Normal: 
     if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth}); 
      break; 
     } 
     goto case PhotoSize.Small; 
    case PhotoSize.Small: 
     if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth}); 
      break; 
     } 
     goto case PhotoSize.Thumb; 
    case PhotoSize.Thumb: 
     if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0) 
     { 
      photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth}); 
      break; 
     } 
     break; 
    } 
0

条件の場合の外で "休憩" を入れてください。..

MediaStream photoMediaStream = null; 
switch (photoSize) 
{ 
    case PhotoSize.Normal: 
    if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0) 
    { 
     photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth}); 

    } 
break; 
case PhotoSize.Small: 
    if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0) 
    { 
     photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth}); 

    } 
break; 
case PhotoSize.Thumb: 
    if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0) 
    { 
     photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth}); 

    } 
break; 
}