C#切换语句有/无大括号…有什么区别?
C#总是允许你省略case:
switch()
语句之间的switch()
语句中的大括号吗?
像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 }
大括号不是必需的,但它们可能派上用场,引入一个新的申报空间 。 据我所知,从C#1.0开始,这种行为并没有改变。
忽略它们的效果是,所有在switch
语句内部声明的variables在所有的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; } }
花括号是开关块的可选部分,它们不是开关部分的一部分。 大括号可以插入到开关部分中,也可以插入到任何地方以控制代码中的范围。
它们可以用来限制开关块内的范围。 例如:
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。 这是防止意外变化的后续。
交换机内的支架实际上不是交换机结构的一部分。 他们只是范围块,你可以在任何你喜欢的代码中应用。
拥有它们和没有它们之间的区别在于每个块都有它自己的范围。 您可以在范围内声明局部variables,这与另一个范围内的其他variables不冲突。
例:
int x = 42; { int y = x; } { int y = x + 1; // legal, as it's in a separate scope }
他们不是绝对必要的,但是一旦你开始声明局部variables(在开关分支),他们是非常推荐的。
这不会工作:
// 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; }
只要保持简单和可读性。 您不想要求读者详细了解中间示例所涉及的规则。