c# - switch函数 - switch




C#switch语句中的变量声明 (5)

“在我的Daaaaays ...”

swicth是一个非常原始的程序实现,自从C本身(甚至在C++之前)以来一直存在。

整个switch是一个用作包含作用域的GOTO: (因此:在每种case )。 如果你参加了一些汇编类,那看起来似乎很熟悉。

这就是为什么switch使用在与Enum s结合时最有用,而不是在每一种case都使用break

switch(mood)
{
    case Mood.BORED:
    case Mood.HAPPY:
        drink(oBeer) // will drink if bored OR happy
break;

    case Mood.SAD: // unnecessary but proofs a concept
    default:
        drink(oCoffee)
break;
}

为什么在C#switch语句中,对于在多种情况下使用的变量,只能在第一种情况下声明它?

例如,以下内容将引发错误“已在此范围内定义了一个名为'变量'的局部变量”。

switch (Type)
{
    case Type.A:
            string variable = "x";
                break;
    case Type.B:
            string variable = "y";
                break;
}

但是,根据逻辑,如果类型为Type.B ,则不应击中初始声明。 switch语句中的所有变量是否存在于单个作用域中,并且是在处理任何逻辑之前创建/分配的?


初始化在案例中发生,但是声明在范围的顶部有效完成。 (伪码)

switch (Type)
{
string variable;

    case Type.A:
            variable = "x";
                break;
    case Type.B:
            variable = "y";
                break;
}

因为他们的范围在交换机块。 C#语言规范声明如下:

开关块中声明的局部变量或常量的范围是开关块。


如果您想要将变量作用于某个特定的案例,只需将案例放在自己的块中即可:

switch (Type)
{
    case Type.A:
    {
        string variable = "x";
        /* Do other stuff with variable */
    }
    break;

    case Type.B:
    {
        string variable = "y";
        /* Do other stuff with variable */
    }
    break;
}

是的,范围是整个开关块 - 不幸的是,国际海事组织。 但是,您可以随时在一个案例中添加大括号,以创建一个较小的范围。 至于它们是否被创建/分配 - 堆栈框架为方法中的所有局部变量提供了足够的空间(不考虑捕获的变量的复杂性)。 这不是在方法执行期间分配空间。





switch-statement