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
}
答案 0 :(得分:98)
不需要使用大括号,但它们可能会派上用场来引入新的声明空间。据我所知,自C#1.0以来,这种行为没有改变。
省略它们的效果是在switch
语句中声明的所有变量在所有case分支的声明点都是可见的。
另见Eric Lippert的例子(帖子中的案例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 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;
}
}
答案 1 :(得分:13)
花括号是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#将要求您在第一个示例中的case 5块中将值设置为y。这是对意外变量的保护。
答案 2 :(得分:8)
交换机内的支架实际上根本不是交换机结构的一部分。它们只是范围块,您可以在任何您喜欢的代码中应用它们。
拥有它们与没有它们之间的区别在于每个块都有自己的范围。您可以在范围内声明局部变量,这不会与另一个范围中的其他变量冲突。
示例:
int x = 42;
{
int y = x;
}
{
int y = x + 1; // legal, as it's in a separate scope
}
答案 3 :(得分: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;
}
保持简单易读。您不希望要求读者详细了解中间示例中涉及的规则。