我对这件事很好奇......见例子:
switch(x)
{
case(a):
{
//do stuff
}
break;
case(b):
//do stuff
break;
}
我一生都像案例 b 那样做,但是由于 C# 允许我使用它,而 Visual Studio 允许我折叠那个东西,我很好奇 - 案例 a(带大括号)和案例 b 之间的真正区别是什么?
我对这件事很好奇......见例子:
switch(x)
{
case(a):
{
//do stuff
}
break;
case(b):
//do stuff
break;
}
我一生都像案例 b 那样做,但是由于 C# 允许我使用它,而 Visual Studio 允许我折叠那个东西,我很好奇 - 案例 a(带大括号)和案例 b 之间的真正区别是什么?
一对带有零个或多个语句的大括号(不是括号--[]
而不是括号--()
而是大括号 {}
)是 C# 中的合法语句,因此可以出现在语句可能合法出现的任何地方。
正如其他人指出的那样,这样做的典型原因是因为这样的语句引入了一个新的局部变量声明空间,然后定义了在其中声明的局部变量的范围。(回想一下,元素的“范围”是程序文本的区域,在该区域中,元素可以通过其非限定名称来引用。)
我注意到这在语句中特别有趣,switch
因为 switch 中的范围规则有点奇怪。有关它们有多奇怪的详细信息,请参阅我关于该主题的文章中的“案例 3:”:
大括号 {} 用于定义一组操作的范围。奇怪的是,以下将编译和工作:
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++;
}
}
如您所见,在该方法中,我创建了四个变量,每个变量称为 a。每个都是完全独立的,因为作为局部变量,它们只存在于自己的范围内。
这有某种意义吗?
它创建了一个新范围,您可以在其中创建新变量。
它为您使用的变量创建了新的范围。变量的范围有时可能很棘手。例如在您发布的代码中;
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)
变量a
被超出范围访问。现在另一方面,
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在他的博客上分享了一个很好的链接来解释 case 语句中的变量作用域。你应该看看它。