私はJavascript: the Definitive Referenceを読んでおり、93ページに次のように書かれています:
まれに、1 つのケース ラベルから次のケース ラベルにフォールスルーするこのようなコードを書くと便利ですが、99% の場合、switch 内のすべてのケースを break ステートメントで終了するように十分に注意する必要があります。
どのような状況で、switch ステートメントを複数の case ステートメントにフォールスルーさせますか?
私はJavascript: the Definitive Referenceを読んでおり、93ページに次のように書かれています:
まれに、1 つのケース ラベルから次のケース ラベルにフォールスルーするこのようなコードを書くと便利ですが、99% の場合、switch 内のすべてのケースを break ステートメントで終了するように十分に注意する必要があります。
どのような状況で、switch ステートメントを複数の case ステートメントにフォールスルーさせますか?
便利なケースの 1 つは、複数の値が同じ結果になる場合です。
switch (value) {
case 1:
case 2:
action1();
break;
case 3:
case 4:
case 5:
action2();
break;
}
空のケースは次のケースに落ちます。この場合、混乱のリスクは最小限です。
本の著者が心配しているケースは、アクションを組み合わせる場合です。たとえば、値にとの2
両方が必要な場合です。action2
action3
switch (value) {
case 1:
action1();
break;
case 2:
action2();
// continue with action3
case 3:
action3();
break;
}
a を忘れるのbreak
はよくある間違いなので、上記のようなコメントを追加して、意図的に省略したことを明確にする必要があります。
比較のために; break
C#では、 a のa を単に省略することはできません。代わりにswitch
a を使用してgoto
、実行を続行するケースを指定する必要があります。
私がこれまでに行ったことがあるのは、ユーザー入力が大文字で優先され、小文字で受け入れられる場合だけです。
switch(input){
case 'a':
print "Please use uppercase next time";
case 'A':
//do stuff here
break;
}
すべて同じコードを取得する必要がある複数のケースがある場合は、確かに受け入れられます。
switch(val) {
case "aa":
case "bb":
// do you thing here
break;
}
この本は、この種の推奨事項を発行するのではなく、事実に固執する必要があると思います。前のブロックにステートメントcase
がない場合、次のブロックが実行されることに注意してください。break
これは便利ですが、混乱を招く可能性もあります (つまり、break
ステートメントが欠落しているとバグが発生します)。いつ使用するかは主観的ですが、基本的には条件がor
式のような場合に使用できます。
if(myvar == x || myvar == y) {
// do A
} else if (myvar == w || myvar == z) {
// do B
} else {
// do C
}
次のように書き換えることができます。
switch(myvar) {
case x:
case y:
// do A
break;
case w:
case z:
// do B
break;
default:
// do C
break;
}
}