开关情况下额外的大括号的目的是什么

本文关键字:是什么 开关 情况下 | 更新日期: 2023-09-27 18:30:34

我对这个东西很好奇...请参阅示例:

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

一生都像案例b一样做它,但是由于C#允许我使用它,而Visual Studio允许我折叠它,我很好奇 - 案例a(带大括号)和案例b之间的真正区别是什么?

开关情况下额外的大括号的目的是什么

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

正如其他人所指出的,这样做的典型原因是因为这样的语句引入了一个新的局部变量声明空间,然后定义在其中声明的局部变量的范围。(回想一下,元素的"范围"是程序文本的区域,在该区域中,元素可能由其非限定名称引用

我注意到这在switch语句中特别有趣,因为开关中的范围规则有点奇怪。有关它们有多奇怪的详细信息,请参阅我关于该主题的文章中的"案例3:":

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

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

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分享了一个非常好的博客链接,以解释案例陈述中的变量范围。你应该看看它。