switch
これは特にC#の質問ではありませんが、私が質問するのはC#バージョンです。
case
フォールスルーしたい場合を示す代わりに、あるステートメントから次のステートメントにフォールスルーしたくないことを明示的に述べる必要があるのはなぜですか?
C# では、コンパイラはcase
(ステートメントが空の場合を除いて) あるステートメントから次のステートメントに移行することを許可しませんが、すべてのステートメントの最後にcase
明示的に配置することを強制します。私が書いたステートメントbreak
の大部分は失敗しません。switch
int x = 4;
string result;
switch (x)
{
case 1:
result = "One";
break;
case 2:
result = "A couple";
break;
case 3:
case 4:
result = "Three or four";
break;
/*
case 5:
result = "Five"; // Here be an error! A common typo for me!!!
*/
default:
result = "Five or more";
break;
}
上記の例は、可能性を示すために工夫されています。実際に失敗する回数 (上記の 3 から 4 の間など) は最小限です。上記のケース 5 からコメントを削除すると、C# コンパイラはそれをエラーとしてキャッチします。コンパイラが私がやろうとしていることを完全に知っているのに、なぜ手動で修正しなければならないのですか?
以下の方が良いのではないでしょうか?
int x = 4;
string result;
switch (x)
{
case 1:
result = "One";
case 2:
result = "A couple";
case 3:
continue; // or even goto 4
case 4:
result = "Three or four";
/*
case 5:
result = "Five"; // This would not longer be an error!! Hooray!
*/
default:
result = "Five or more";
}
ここでフォールスルーを主張しているわけではないことを明確にさせてください. break
すべてのcase
ステートメントの最後に暗黙があります。2 つの例は、機能的に同等であることを意図しています。
ケース 3のステートメントを忘れた場合でも、コンパイラは私に怒鳴る可能性がcontinue
あります。実際、このケースでは、スケルトン コードを埋め損ねた可能性が非常に高いです。使える。ステートメントを忘れたと私に言うことbreak
は決して役に立ちません。コンパイラを満足させるのは、もっと忙しい仕事です。
これはおそらくCからのホールドオーバーに過ぎないようです(caseステートメントにコードがある場合でも、失敗する可能性があります)。私が見えないもっと深い理由がありますか?
今朝、いくつかのコンパイラ コードを見ていましたが、オペレーション コードを返すだけのcase
ステートメントが aに何百もありました。switch
それぞれに発表がありましたbreak
。たくさんのタイピングと混乱...
人々はどう思いますか?2 番目のオプションがより適切なデフォルトではないのはなぜですか?