80

switch()C# では、ステートメント間のステートメント内の中括弧を常に省略できますcase:か?

JavaScript プログラマーがよく行うように、それらを省略した場合の影響は何ですか?

例:

switch(x)
{
  case OneWay:
  {                               //  <---- Omit this entire line
    int y = 123;
    FindYou(ref y);
    break;
  }                               //  <---- Omit this entire line
  case TheOther:
  {                               //  <---- Omit this entire line
    double y = 456.7; // legal!
    GetchaGetcha(ref y);
    break;
  }                               //  <---- Omit this entire line
}
4

4 に答える 4

117

中括弧は必須ではありませんが、新しい宣言スペースを導入するのに役立つ場合があります。私の知る限り、この動作は C# 1.0 以降変わっていません。

それらを省略することの効果は、ステートメント内のどこかで宣言されたすべての変数が、switchすべてのケース分岐を通して宣言のポイントから見えることです。

Eric Lippert の例 (投稿のケース 3) も参照してください。

4 つのスイッチの奇妙さ

エリックの例:

switch(x)
{
  case OneWay:
    int y = 123;
    FindYou(ref y);
    break;
  case TheOther:
    double y = 456.7; // illegal!
    GetchaGetcha(ref y);
    break;
}

と がステートメントによって導入された同じ宣言空間にあるためint y、これはコンパイルされません。中括弧を使用して宣言スペースを区切ることで、エラーを修正できます。double yswitch

switch(x)
{
  case OneWay:
  {
    int y = 123;
    FindYou(ref y);
    break;
  }
  case TheOther:
  {
    double y = 456.7; // legal!
    GetchaGetcha(ref y);
    break;
  }
}
于 2010-09-06T15:03:06.590 に答える
16

中括弧はswitch ブロックのオプション部分であり、switch セクションの一部ではありません。中かっこは、スイッチ セクション内に挿入することも、任意の場所に均等に挿入して、コード内のスコープを制御することもできます。

これらは、スイッチ ブロック内のスコープを制限するのに役立ちます。例えば:

int x = 5;

switch(x)
{
case 4:
    int y = 3;
    break;
case 5:
    y = 4;
    //...                      
    break;
}

対...

int x = 5;

switch(x)
{
  case 4:
  {
    int y = 3;
    break;
  }
  case 5:
  {
    y = 4;//compiling error
    //...                      
    break;
  }
}

注: C# では、使用する前に、最初の例のケース 5 ブロック内で値を y に設定する必要があります。これは、偶発的な可変フォロースルーに対する保護です。

于 2010-09-06T15:00:21.007 に答える
10

スイッチ内のブレースは、実際にはスイッチ構造の一部ではありません。これらは単なるスコープブロックであり、コードで好きな場所に適用できます。

それらを持っている場合と持っていない場合の違いは、各ブロックに独自のスコープがあることです。スコープ内でローカル変数を宣言できます。これは、別のスコープ内の他の変数と競合しません。

例:

int x = 42;
{
  int y = x;
}
{
  int y = x + 1; // legal, as it's in a separate scope
}
于 2010-09-06T15:13:11.093 に答える
5

これらは厳密に必要というわけではありませんが、(switch ブランチで) ローカル変数を宣言し始めるとすぐに、それらを強くお勧めします。

これはうまくいきません:

    // does not compile
    switch (x)
    {
        case 1 :               
            int j = 1;
            ...
            break;

        case 3:
            int j = 3;   // error
            ...
            break;
    }

これはコンパイルされますが、不気味です:

    switch (x)
    {
        case 1 :               
            int j = 1;
            ...
            break;

        case 3:
            j = 3;
            ...
            break;
    }

したがって、これが最適です。

  switch (x)
    {
        case 1 : 
         {             
            int j = 1;
            ...
         }
         break;  // I prefer the break outside of the  { }

        case 3: 
         {
            int j = 3;
            ...
         }
         break;
    }

シンプルで読みやすいものにしてください。真ん中の例に含まれるルールの詳細な知識を読者に要求したくはありません。

于 2010-09-06T15:01:34.483 に答える