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在所有 case 分支中从它们的声明点可见。

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

四个开关怪事

埃里克的例子:

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;
  }
}
于 2010-09-06T15:03:06.590 回答
16

花括号是switch 块的可选部分,它们不是 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# 将要求您在第一个示例中的 case 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 回答