带有/不带有大括号的C#Switch语句……有什么区别?


74

C#是否始终允许您在switch()语句之间的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
}

Answers:


108

不需要花括号,但是它们可能会派上用场以引入一个新的声明空间。据我所知,自C#1.0起,这种行为就没有改变。

忽略它们的结果是,在switch语句中某个地方声明的所有变量在所有case分支的声明点都可见。

另请参阅Eric Lippert的示例(帖子中的案例3):

四个开关奇数

埃里克(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处于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年

15

花括号是开关块的可选部分,不是开关部分的一部分。括号可以插入开关部分中,也可以插入任何地方以控制代码范围。

它们对于限制切换块内的范围很有用。例如:

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#将要求您在使用第一个示例的case 5块内将值设置为y。这是防止意外变量跟踪的保护措施。


10

开关内部的支撑实际上根本不是开关结构的一部分。它们只是作用域块,您可以在任何喜欢的地方将其应用在代码中。

拥有和不拥有它们的区别在于,每个块都有自己的作用域。您可以在范围内声明局部变量,该局部变量与另一个范围内的其他变量不冲突。

例:

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

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

只需使其简单易读即可。您不想要求读者对中间示例中涉及的规则有详细的了解。


“诡异”是准确的。:)
neonblitzer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.