...
case 1:
string x = "SomeString";
...
break;
case 2:
x = "SomeOtherString";
...
break;
...
C#のswitchステートメントについて理解していないことがありますか?ケース2を使用した場合、なぜこれがエラーにならないのでしょうか。
編集:このコードは機能し、エラーをスローしません。
...
case 1:
string x = "SomeString";
...
break;
case 2:
x = "SomeOtherString";
...
break;
...
C#のswitchステートメントについて理解していないことがありますか?ケース2を使用した場合、なぜこれがエラーにならないのでしょうか。
編集:このコードは機能し、エラーをスローしません。
switch
ここでのステートメントについてどう考えるか注意する必要があります。実際、可変スコープの作成はまったく行われていません。ケース内のコードがインデントされたからといって、子スコープ内にあるという事実を認めないでください。
switchブロックがコンパイルされると、case
ラベルは単純にラベルに変換さgoto
れ、switching式に応じてswitchステートメントの先頭で適切な命令が実行されます。実際、 MSDNページが示唆しているように、ステートメントを手動で使用goto
して「フォールスルー」状況(C#が直接サポートしている)を作成できます。
goto case 1;
ブロック内の各ケースのスコープを具体的に作成したい場合switch
は、次のようにすることができます。
...
case 1:
{
string x = "SomeString";
...
break;
}
case 2:
{
string x = "SomeOtherString";
...
break;
}
...
これには、変数を再宣言する必要がありx
ます(そうしないと、コンパイラエラーが発生します)。それぞれ(または少なくともいくつか)をスコープする方法は、特定の状況で非常に役立つ場合があり、コードで時々それを確実に見ることができます。
MSDNのドキュメントには次のように書かれています。
switchステートメント(セクション8.7.2)のswitch-blockで宣言されたローカル変数のスコープは、switch-blockです。
また、以前にも同様の質問があり ました。c#switchステートメントでの変数宣言
switchステートメントは変数の新しいスコープを作成しないため、コンパイラエラーは発生しません。
スイッチ内で変数を宣言する場合、変数はスイッチを囲むコードブロックと同じスコープにあります。この動作を変更するには、{}を追加する必要があります。
...
case 1:
// Start a new variable scope
{
string x = "SomeString";
...
}
break;
case 2:
{
x = "SomeOtherString";
...
}
break;
...
これにより、コンパイラは文句を言います。ただし、switch自体は内部的にこれを行わないため、コードにエラーはありません。
変数のスコープは、ケースではなくスイッチ内にあるように見えます。おそらく、ケースを積み重ねることができるためです。スイッチの外部でxを参照しようとすると、失敗することに注意してください。
ケース内でローカル変数を作成している場合、ケース外でそれらを使用することはできません。
...
int opt ;
switch(opt)
{
case 1:
{
string x = "SomeString";
...
}
break;
case 2:
{
string x = "SomeOtherString";
...
}
break;
default:
{
//your code
}
break;
}
...
文字列宣言を前に移動します
switch(value)
声明。次に、それぞれの場合にxを割り当てます。