2010-09-06 50 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 
} 
相关问题