2017-11-21 3 views
1

は通常、C#でswitch文は、このswitchステートメント内のcase/defaultブロックごとにC#switchステートメントを中括弧で囲みます。

switch (sh) 
{ 
    case 1: 
     DoThis(); 
     DoThat(); 
     break; 
    case 2: 
     DoThis(); 
     DoThat(); 
     break; 
    default: 
     DoThis(); 
     DoThat(); 
     break; 
} 

のように見えるが初めてのために、私は以下のようなswitchステートメント内の各case文のために中括弧を使用して誰かを見た:

switch (sh) 
{ 
    case 1: 
    { 
     DoThis(); 
     DoThat(); 
     break; 
    } 
    case 2: 
    { 
     DoThis(); 
     DoThat(); 
     break; 
    } 
    default: 
    { 
     DoThis(); 
     DoThat(); 
     break; 
    } 
} 

これらの中括弧はなぜですか?{}はそれぞれのケースと上記のcase文のデフォルトブロックで使用されていますか?

なぜ必要なのですか?

違いは何ですか?

+6

これらは必要ありません。任意のコードを中括弧で囲み、新しい入れ子コード領域を作成することができます。 – Will

+1

また、 'switch(){case:}'ステートメントがあると、複数のステートメントを囲むように読みやすくなります。 – MethodMan

+0

コードブロックは入れ子領域を作成し、変数の範囲を制限しますが、上記のスイッチのステートメントでは、この理由はありません。ありがとう – pixel

答えて

5

彼らが必要としていますが、複数のブランチで同じ名前の変数を宣言する場合、彼らは便利ですされていません。

switch (sh) { 
    case 1: 
     var test = "test"; 
     Console.WriteLine(test); 
     break; 
    case 2: 
     var test = "test"; 
     Console.WriteLine(test); 
     break; 
} 

これは、変数名を相反する文句、コンパイルされません。しかし、中括弧を追加すると、各ブランチに独自のスコープが作成され、うまくコンパイルされます。

switch (sh) { 
    case 1: { 
     var test = ""; 
     Console.WriteLine(test); 
     break; 
    } 
    case 2: { 
     var test = ""; 
     Console.WriteLine(test); 
     break; 
    } 
} 

変数を定義していない場合でも、これに慣れていて、常にブレイザーを追加する人もいます。

+0

'case'節が' switch'単語と一直線に並んでいることを示すコードをつけて私はいつも気になります。私はあなたの例のように彼らが好きです。 :) –

0

これは古いコードのままです。私はCで覚えていませんが、私はちょうど次の場合に落ちるでしょう...

これはもはや関連性がなく、単なるコードスタイルです。

注意あなたも

switch (sh) 
{ 
    case 1: 
     DoThis(); 
     DoThat(); 
     break; 
    case 2: 
    { 
     DoThis(); 
     DoThat(); 
    }break; 
    case 3: 
    case 4: 
    { 
     DoThis(); 
     DoThat(); 
    } 
    case 5: 
     goto case 1; 
    default: 
    { 
     DoThis(); 
     DoThat(); 
    } 
} 

を行うことができますブレークはちょうどスイッチを残すが、ブラケットを出た後、左されます。

1

switchステートメントで時々直面する問題は、すべてのケースが同じ範囲にあることです。つまり、2つのケースで同じ変数名を使用することはできません。あなたが同じスコープに二回resultを宣言しているので、これは、コンパイルエラーにつながる

switch (sh) { 
    case 1: 
     int result = 1; 
     return result; 
    case 2: 
     int result = 2; 
     return result; 
} 

:これを考えてみましょう。あなたはケースに新しいスコープを導入することで、エラーを取り除く:

switch (sh) { 
    case 1: { 
     int result = 1; 
     return result; 
    } 
    case 2: { 
     int result = 2; 
     return result; 
    } 
} 

は、彼らは追加の複雑さを紹介するためswitch例は、やや物議をしていることを考えると、余分なスコープを追加すると混乱に追加されます。私は説明された問題を引き起こさない方法で(ブロックのコード量を低く抑え、大きいswitchブロックを避けるように)、switchブロックを使用することを好む。

あなたの例では、スコープは必要ではなく、一般的な基準では使用しません。これは「異常な」コードなので、そして、珍しいことは通常、混乱を意味します。あなたの質問はその意見に対する証拠です(そして、ここでの宗教的戦争を避けるための意見です)。なぜなら、この構成があなたに質問をするほど混乱させたからです。

関連する問題