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 番目のオプションがより適切なデフォルトではないのはなぜですか?