102

switchVS2008 C# で次のようなステートメントを作成すると(不自然):

switch (state) {
    case '1':
        state = '2';
    case '2':
        state = '1';
}

ドロップスルーが許可されていないと不平を言います:

コントロールは、1 つのケース ラベル ('case '1' (0x31):') から別のケース ラベルに移行できません。

立ち去ることが許されないのなら、break声明の目的は何ですか?なぜ言語設計者switchは、不必要な構造を強制的に入れる代わりに、単にそれを省略してステートメントの最後に自動的にジャンプしなかったのでしょうか?

4

4 に答える 4

88

基本的には、C / C ++/Java開発者にとってより身近なものにするためです。個人的には間違いだったと思いますが、それが理由です。

私は強制ブロックを好んだでしょう:

case '1':
{
}

他のことは別として、それはスイッチ/ケースの奇妙な変数スコープの状況を回避したでしょう。もちろん、複数のケースラベルを付けることもできます。

case '0':
case '1':
{
}

複数のケースをより簡単にリストできると便利な場合もあります。

case '0', '1':
{
}

ああ、そして既存の言語のあなたの説明についてのちょっとしたちょっとしたこと:あなたは休憩する必要はありません。ケースの終わりに到達できないようにする必要があるというだけです。throw、、gotoまたはを使用することもできますreturn。私が見逃した他の人もいるかもしれません:)

于 2010-06-24T10:00:14.600 に答える
77

馬の口から (MSDN) C# の switch ステートメントがフォールスルーを許可しないように設計されているのに、中断が必要なのはなぜですか? .

顕著なビットを引用すると、これがフォールスルーを許可しない理由です。

この暗黙的なフォールスルー動作は、多くの場合、必要なコードの量を減らすために使用され、多くの場合、コードが最初に記述されるときには問題になりません。ただし、コードが初期開発フェーズから保守フェーズに移行するにつれて、上記のコードはデバッグが非常に困難な微妙なエラーにつながる可能性があります。これらのエラーは、開発者がケースを追加しているにもかかわらず、ブロックの最後にブレークを配置するのを忘れるという非常によくある間違いによって発生します。

C# では、switch ステートメントでは、ケースの終わり (break、goto、return、または throw) で明示的なフロー制御が発生する必要があります。開発者がフォールスルー セマンティクスを望む場合は、case ステートメントの末尾にある明示的な goto によって実現できます。

そして、これが自動ではない理由です:

C# の規則では、case ブロック (ほとんどの場合はブレーク) の最後で明示的なフロー制御が発生する必要があるため、フォールスルーが発生しないように動作が単純に変更されなかった理由を多くの人が疑問に思っています。つまり、break を必須にせず、単純に switch のセマンティクスを変更して、ケースのフォールスルーがないようにします。これが行われなかった理由は、C++ に非常に慣れている開発者が、switch ステートメントの動作を理解するのに苦労しないようにするためです。

于 2010-06-24T11:29:36.707 に答える
52

ドロップスルーは許可されていますが、キーワードを使用して明示的に行う必要があります。goto

switch (state) {
    case '1':
        state = '2';
        goto case '2';
    case '2':
        state = '1';
        break;
}

breakまたはC# で行うこともできgotoますが、できないのは、見つけにくいバグの潜在的な原因になるため、必要な状態を示すことではありません。

どちらかを追加するのを忘れていることを見つけるよりも、goto必要なときにコードが言っていること (またはその逆) を見つける方がはるかに簡単です。break

ばかげているように聞こえるかもしれませんが、C++ のバグの原因を 2 時間かけて探し続けた結果、 を追加するのを忘れていてbreak、コードが常に失敗していることに突然気づきました。C# は、必要なものを明示することを強制することで、これを回避します。

于 2010-06-24T10:12:34.917 に答える
12

ケース1のコードがない場合は、フォールスルーが許可されているため、「これらのケースはすべて、このコードを共有している」と言えます。

于 2010-06-24T09:59:13.743 に答える