带/不带大括号的 C# Switch 语句....有啥区别?
Posted
技术标签:
【中文标题】带/不带大括号的 C# Switch 语句....有啥区别?【英文标题】:C# Switch statement with/without curly brackets.... what's the difference?带/不带大括号的 C# Switch 语句....有什么区别? 【发布时间】:2011-04-08 19:41:29 【问题描述】: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
【问题讨论】:
来自java世界***.com/questions/633497/… 【参考方案1】:花括号是switch block 的可选部分,它们不是开关部分的一部分。大括号可以插入到 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,然后再使用它。这是针对意外变量后续的保护。
【讨论】:
【参考方案2】:它们不是绝对必要的,但是一旦您开始声明局部变量(在 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;
保持简单易读。您不想要求读者对中间示例中涉及的规则有详细的了解。
【讨论】:
“幽灵”是准确的。 :)【参考方案3】:花括号不是必需的,但它们可能会派上用场来引入新的声明空间。据我所知,这种行为自 C# 1.0 以来没有改变。
省略它们的效果是,在 switch
语句中某处声明的所有变量在所有 case 分支中从它们的声明点可见。
另请参阅 Eric Lippert 的示例(帖子中的案例 3):
Four switch oddities
埃里克的例子:
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。特别是当你的 switch 内容很重要时,这真的很方便。【参考方案4】:switch 内部的大括号实际上根本不是 switch 结构的一部分。它们只是范围块,您可以在任何您喜欢的代码中应用它们。
拥有和不拥有它们的区别在于每个块都有自己的范围。您可以在作用域内声明局部变量,不会与另一个作用域中的其他变量发生冲突。
例子:
int x = 42;
int y = x;
int y = x + 1; // legal, as it's in a separate scope
【讨论】:
以上是关于带/不带大括号的 C# Switch 语句....有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
for,if循环语句可以不带大括号吗?在可以不带的情况下我的循环有错误吗?