C#switch语句中的变量声明

时间:2008-10-21 16:49:26

标签: c# switch-statement

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

例如,以下引发错误“已在此范围中定义名为'variable'的局部变量”。

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

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

7 个答案:

答案 0 :(得分:199)

如果您想要一个作用于特定大小写的变量,只需将大小写括在它自己的块中:

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;
}

答案 1 :(得分:41)

我认为它与变量的整体范围有关,它是在交换机级别定义的块级范围。

就个人而言,如果你在一个开关中为某个东西设置一个值,它真的有任何好处,那么无论如何你都希望在交换机之外声明它。

答案 2 :(得分:31)

是的,范围是整个交换机块 - 不幸的是,IMO。但是,您始终可以在单个案例中添加大括号,以创建较小的范围。至于它们是否被创建/分配 - 堆栈帧有足够的空间用于方法中的所有局部变量(不考虑捕获变量的复杂性)。它不像在方法执行期间分配空间。

答案 3 :(得分:10)

因为它们的范围在交换机块上。 C# Language Specification声明如下:

  

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

答案 4 :(得分:0)

变量确实在C#编译器中共享范围。但是,范围在CIL中不存在相同的方式。至于实际创建/初始化......只要遵循简单的规则,.NET内存模型就允许编译器移动读/写,除非变量标记为volatile

答案 5 :(得分:-2)

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

switch (Type)
{
string variable;

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

答案 6 :(得分:-2)

“在我的Daaaaays ......”

swicth是一个非常原始的程序实现,从C本身的年龄开始(甚至在C++之前)。

整个switch是一个,用作范围包含的GOTO:(因此:中的case。如果您参加了一些汇编程序,那可能看起来很熟悉。

这就是为什么switch在与Enum结合使用时最有用,而不是在每个break中使用case

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;
}