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 ydouble yswitch语句引入的同一个声明空间中。 您可以通过使用大括号分隔声明空间来修复错误:

 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; } 

只要保持简单和可读性。 您不想要求读者详细了解中间示例所涉及的规则。