C# 带/不带花括号的 switch 语句... 有什么区别?

19 浏览
0 Comments

C# 带/不带花括号的 switch 语句... 有什么区别?

在C#中,你始终可以在switch()语句的case:语句之间省略花括号吗?

省略它们会产生什么效果,就像JavaScript程序员经常做的那样?

示例:

switch(x)
{
  case OneWay:
  {                               //  <---- 省略这一行代码
    int y = 123;
    FindYou(ref y);
    break;
  }                               //  <---- 省略这一行代码
  case TheOther:
  {                               //  <---- 省略这一行代码
    double y = 456.7; // 合法!
    GetchaGetcha(ref y);
    break;
  }                               //  <---- 省略这一行代码
}

0
0 Comments

C#中的switch语句可以选择使用或者不使用花括号(curly brackets),这两种方式的区别在于是否引入了一个新的声明空间。从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类型的y和double类型的y处于同一个由switch语句引入的声明空间。而我们可以通过使用花括号来分隔声明空间来修复这个错误:

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

使用花括号的方式特别适用于switch语句的内容较为复杂的情况。

0
0 Comments

在C#中,使用switch语句时可以选择是否使用花括号。花括号实际上并不是switch结构的一部分,而只是作用域块,可以在代码中任何地方使用。

有无花括号的区别在于每个块都有自己的作用域。在作用域中可以声明局部变量,而这些变量不会与另一个作用域中的变量发生冲突。

例如:

int x = 42;
{
  int y = x;
}
{
  int y = x + 1; // 合法,因为它在一个独立的作用域中
}

使用花括号可以更明确地定义作用域,使代码更易读。但是,在某些情况下,如果switch语句中只有一条语句,可以省略花括号以简化代码。

然而,省略花括号也可能导致错误。如果在同一个作用域中多次使用switch语句,并且省略了花括号,那么变量可能会出现预期之外的行为。

为了避免这种问题,建议始终使用花括号来定义作用域,即使只有一条语句。这样可以确保代码的可读性和可维护性,并减少错误的发生。

0
0 Comments

在C#的Switch语句中,花括号是可选的,它们不是Switch部分的一部分。花括号可以在Switch部分中插入,也可以在代码中的任何位置插入以控制作用域。

在Switch块中限制作用域时,花括号非常有用。例如:

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;//编译错误
    //...                      
    break;
  }
}

注意:在第一个例子中,C#要求在使用之前在case 5块中给y赋值。这是为了防止变量的意外跟随。

问题的出现原因:为了控制作用域以及避免变量的意外跟随,C#中的Switch语句可以使用花括号来限制作用域。

解决方法:在需要限制作用域的地方使用花括号。

0