我对这个事情很好奇......看例子:
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之间的真正区别是什么?
花括号{}用于定义一系列操作的范围。令人惊讶的是,以下代码会编译并运行:
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的变量。每个变量都是完全独立的,因为它们是局部变量,只存在于其自己的作用域内。
这有点讲得通吗?
a
看起来对你来说很正常,那么你一直在看错误的代码。 :) - cHao它为您使用的变量创建新的作用域。变量的作用域有时可能很棘手。例如,在您发布的代码中;
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;
}
switch(x)
{
case(a):
{
int i = 0;
}
break;
case(b):
{
int i = 1; // No error
}
break;
}
Eric Lippert分享了一篇非常好的博客链接,以解释在case语句中变量作用域的内容。您应该查看一下。
case
块很难阅读。如果我需要作用域或任何其他复杂性,它会得到一个新的方法。 - Jay Bazuzi