Switch机箱中额外支架的用途是什么?

我很好奇这件事…看例子:

switch(x) { case(a): { //do stuff } break; case(b): //do stuff break; } 

我所做的一切,就像情况b一样,但是因为C#允许我使用它,所以Visual Studio允许我把这个东西折叠起来,我很好奇 – case a(带大括号)和case b ?

大括号{}用于定义一组操作的范围。 奇怪的是,以下将编译和工作:

 private void ConnectionStateChange(object sender, StateChangeEventArgs e) { string s = "hi"; switch(s) { case "hi": { int a = 1; a++; } { int a = 2; a++; } break; } { int a = 1; a++; } { int a = 2; a++; } } 

正如你所看到的,在这个方法中,我创build了四个variables,每个variables都被称为a。 每个都是完全独立的,因为作为局部variables,它们只存在于它们自己的范围内。

这是否有某种意义?

一对大括号(不是括号[] – 而不是括号() – 但大括号 {} )中有零个或多个语句是C#中的一个法律声明,因此可能出现在声明可能出现的任何地方合法出现。

正如其他人所指出的那样,这样做的典型原因是因为这样的陈述引入了一个新的局部variables声明空间 ,然后定义了在其中声明的局部variables的范围。 (回想一下,元素的“范围”是程序文本的区域,元素可以用其非限定名称引用 )。

我注意到这在switch语句中特别有趣,因为switch中的作用域规则有点奇怪。 有关这些内容有多奇怪的细节,请参阅关于此主题的文章“案例3:”:

http://ericlippert.com/2009/08/13/four-switch-oddities/

它创build了一个新的范围,您可以在其中创build新的variables。

它为您使用的variables创build了新的范围。 variables的范围有时可能会非常棘手。 例如在您发布的代码中;

 switch(x) { case(a): { int i = 0; } break; case(b): i = 1; // Error: The name 'i' doesn't exist in the current context break; } 

case(b)variablesa被访问超出范围时,这个错误是有意义的。 另一方面,

 switch(x) { case(a): { int i = 0; } break; case(b): int i = 1; // Error: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else break; } 

以上两个错误看起来相互矛盾。 为了解决这个问题,你应该在两个case语句中分别定义范围,

 switch(x) { case(a): { int i = 0; } break; case(b): { int i = 1; // No error } break; } 

Eric Lippert与他的博客分享了一个非常好的链接来解释案例陈述中的variables范围。 你应该看看它。