141

C# の switch ステートメントで、複数のケースで使用される変数に対して、最初のケースでのみ宣言するのはなぜですか?

たとえば、次の例では、「'variable' という名前のローカル変数は、このスコープで既に定義されています」というエラーがスローされます。

switch (Type)
{
    case Type.A:
            string variable = "x";
                break;
    case Type.B:
            string variable = "y";
                break;
}

ただし、ロジック上、型が の場合、最初の宣言はヒットしないはずですType.B。switch ステートメント内のすべての変数は単一のスコープに存在し、ロジックが処理される前に作成/割り当てられますか?

4

7 に答える 7

264

変数のスコープを特定のケースに限定したい場合は、ケースを独自のブロックで囲むだけです。

switch (Type)
{
    case Type.A:
    {
        string variable = "x";
        /* Do other stuff with variable */
    }
    break;

    case Type.B:
    {
        string variable = "y";
        /* Do other stuff with variable */
    }
    break;
}
于 2008-10-21T17:11:49.487 に答える
50

変数の全体的なスコープに関係していると思います。これは、スイッチ レベルで定義されるブロック レベルのスコープです。

個人的には、例のスイッチ内の何かに値を設定して実際に利益を得る場合は、とにかくスイッチの外で宣言することをお勧めします。

于 2008-10-21T16:52:11.197 に答える
37

はい、スコープはスイッチ ブロック全体です。残念ながら、IMO です。ただし、より小さなスコープを作成するために、常に単一のケース内にブレースを追加できます。それらが作成/割り当てられているかどうかについて-スタックフレームには、メソッド内のすべてのローカル変数に十分なスペースがあります(キャプチャされた変数の複雑さは別として)。メソッドの実行中にスペースが割り当てられるわけではありません。

于 2008-10-21T16:52:46.217 に答える
12

それらのスコープは switch ブロックにあるためです。C# 言語仕様には、次のように記載されています。

switch ブロックで宣言されたローカル変数または定数のスコープは、switch ブロックです。

于 2008-10-21T16:52:58.603 に答える
0

変数は、C# コンパイラでスコープを共有します。ただし、スコープはCILでは同じようには存在しません。実際の作成/初期化に関しては....NETメモリモデルでは、変数がvolatileとしてマークされていない限り、単純なルールが守られている限り、コンパイラは読み取り/書き込みを少し移動できます。

于 2008-10-21T16:55:49.643 に答える
-2

switchCは、それ自体の時代から存在していた、非常に原始的な手続き型の実装です( C++.

全体switchは、スコープに含まれる(したがって、each 内の ) として機能するブロックです。アセンブラーのクラスをいくつか受講した場合、それはおなじみのように思えるかもしれません。GOTO::case

そのため、すべてのlikeで使用するのではなく、 s とswitch組み合わせるときに使用が最も役立ちます。Enumbreakcase

switch(mood)
{
    case Mood.BORED:
    case Mood.HAPPY:
        drink(oBeer) // will drink if bored OR happy
break;

    case Mood.SAD: // unnecessary but proofs a concept
    default:
        drink(oCoffee)
break;
}
于 2014-06-20T04:06:22.060 に答える
-3

初期化はケース内で行われますが、宣言は効果的にスコープの先頭で行われます。(疑似コード)

switch (Type)
{
string variable;

    case Type.A:
            variable = "x";
                break;
    case Type.B:
            variable = "y";
                break;
}
于 2008-10-21T16:53:01.443 に答える