2010-09-06 72 views
59

C#允許您在case:語句之間的switch()語句中省略大括號嗎?C#切換語句帶/不帶大括號....有什麼區別?

像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 
} 
+0

從Java世界http://stackoverflow.com/questions/633497/java-switch-cases-with-or-without-braces – nawfal 2013-05-05 09:46:06

回答

87

大括號不是必需的,但它們可能會派上用場,引入一個新的聲明空間。就我所知,這種行爲自C#1.0以來一直沒有改變。

忽略它們的效果是聲明在switch語句內某處的所有變量在所有個案分支中的聲明點都是可見的。

又見埃裏克利珀的例如(實例3在後):

Four switch oddities

Eric的例子:

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

這並不編譯,因爲int ydouble y處於由th引入的同一個聲明空間中e switch聲明。您可以通過分離使用大括號聲明空間修復錯誤:

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

1。特別是當你的交換機內容不重要時,這非常方便。 – TomTom 2010-09-06 15:17:40

+1

但在非平凡的情況下,我喜歡在大括號外面休息,以提高可讀性。 – nawfal 2013-08-07 22:13:49

12

大括號是switch block的可選部分,它們不是開關部的一部分。大括號可以插入到開關部分中,也可以插入任何位置以控制代碼中的範圍。

它們可以用來限制開關塊內的範圍。例如:

int x = 5; 

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

VS ...

int x = 5; 

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

注:C#會要求你在第一個例子中使用它之前的情況下,5塊中設置的值設置爲y。這是防止意外變化的後續措施。

4

它們並不是絕對必要的,但只要您開始聲明局部變量(在開關分支中),它們就非常值得推薦。

這是行不通的:

// 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; 
    } 

只要保持它的簡單性和可讀性。您不想要求讀者詳細瞭解中間示例中涉及的規則。

8

的括號內的開關,其實並不是開關結構的一部分的。他們只是範圍塊,你可以在任何你喜歡的地方應用代碼。

讓他們沒有他們之間的區別是每個塊都有自己的範圍。您可以在範圍內聲明局部變量,這與另一個範圍內的其他變量不衝突。

實施例:

int x = 42; 
{ 
    int y = x; 
} 
{ 
    int y = x + 1; // legal, as it's in a separate scope 
}