56

私はこのことに興味があります...例を参照してください:

switch(x)
{
    case(a):
        {
        //do stuff
        }
        break;
    case(b):
        //do stuff
        break;
}

ケースbのようにこれまでずっとやってきましたが、C#ではそれを使用でき、Visual Studioではそれを折りたたむことができるので、興味があります.ケースa(中括弧付き)とケースbの本当の違いは何ですか? ?

4

4 に答える 4

78

0 個以上のステートメントを含む中かっこのペア (かっこ-- []-- ではなく、かっこ-- ()-- ではなく中かっこ {}) は、C# では正当なステートメントであるため、ステートメントが合法的に表示される場所であればどこにでも表示できます。

他の人が指摘したように、そうする典型的な理由は、そのようなステートメントが新しいローカル変数宣言スペースを導入し、その中で宣言されたローカル変数のスコープを定義するためです。(要素の「スコープ」は、その要素がその非修飾名によって参照される可能性があるプログラム テキストの領域であることを思い出してください。)

スイッチのスコープ規則は少し奇妙であるため、これはステートメントで特に興味深いことに注意してください。switchそれらがどれほど奇妙であるかの詳細については、この件に関する私の記事の「ケース 3:」を参照してください。

http://ericlippert.com/2009/08/13/four-switch-oddities/

于 2012-04-10T19:47:11.373 に答える
71

中括弧 {} は、一連の操作のスコープを定義するために使用されます。奇妙なことに、以下はコンパイルして動作します:

private void ConnectionStateChange(object sender, StateChangeEventArgs e)
{
    string s = "hi";
    switch(s)
    {
        case "hi":
            {
                int a = 1;
                a++;
            }
            {
                int a = 2;
                a++;
            }
            break;
    }

    {
        int a = 1;
        a++;
    }
    {
        int a = 2;
        a++;
    }
}

ご覧のとおり、その 1 つのメソッドで、それぞれ a と呼ばれる 4 つの変数を作成しました。ローカル変数として、それらは独自のスコープ内にのみ存在するため、それぞれが完全に分離されています。

それはある種の意味がありますか?

于 2012-04-10T19:44:53.720 に答える
30

新しい変数を作成できる新しいスコープを作成します。

于 2012-04-10T19:40:43.467 に答える
13

使用した変数の新しいスコープを作成します。変数のスコープは扱いにくい場合があります。たとえば、投稿したコードでは。

switch(x)
{
    case(a):
        {
        int i = 0;
        }
        break;
    case(b):
        i = 1; // Error: The name 'i' doesn't exist in the current context
        break;
}

case(b)変数aがスコープ外でアクセスされるため、エラーはここで理にかなっています。一方では、

switch(x)
{
    case(a):
        {
        int i = 0;
        }
        break;
    case(b):
        int i = 1; // Error: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else
        break;
}

上記の 2 つのエラーは互いに矛盾しているように見えます。これを回避するには、両方の case ステートメントでスコープを個別に定義する必要があります。

switch(x)
{
    case(a):
        {
        int i = 0;
        }
        break;
    case(b):
        {
        int i = 1; // No error
        }
        break;
}

Eric Lippert は、彼のブログへの非常に優れたリンクを共有して、case ステートメントでの変数のスコープを説明しています。あなたはそれを見てください。

于 2012-04-10T19:42:08.347 に答える