C#switch语句中的变量声明

Jer*_*emy 117 c# switch-statement

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

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

switch (Type)
{
    case Type.A:
            string variable = "x";
                break;
    case Type.B:
            string variable = "y";
                break;
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*urr 214

如果你想要一个作用于特定情况的变量,只需将case包含在它自己的块中:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果括号仅包含第一个块而不包含第二个块,则此操作无效.在这种情况下,第二个"变量"仍然发出错误,尽管范围不同.看起来像个bug. (3认同)
  • @ Hi-Angel:这不是一个bug.不能在块或其嵌套块中声明具有相同名称的多个局部变量.实际上,嵌套块'包含'在封闭块中声明的局部变量 - 即使声明稍后在文件中出现.对于除switch语句之外的构造也是如此.请参阅C#语言规范的3.3 (3认同)

Mit*_*ers 44

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

就个人而言,如果你在一个开关中为某个东西设置一个值,它真的有任何好处,你还是想在交换机之外声明它.

  • 跟着牙套.变量仅存在于最先声明变量的最内部括号内. (38认同)
  • 作为一个来自 VB 世界的人,这是我有点讨厌 `switch` 语句的原因之一。其他原因包括必须在每个 case 之后使用 `break;`,并且没有类似 `Case 1, 2, 3`,`Case 4 To 10` 或 `Case Is > 10` 的等价物。 (2认同)

Jon*_*eet 33

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

  • @Randolpho:我觉得这个陈述过于笼统.它可能很容易只有三到四行,但会影响两个或三个局部变量 - 足以让它重构为方法调用. (27认同)
  • 同意,我不止一次碰到这个问题,这是一个两三行的处理逻辑......在一个单独的方法中,只是痛苦. (4认同)
  • 在充分尊重您的Skeetness时,请不要建议在开关盒块中添加示波器.如果您需要为该区块设置一个新的范围,那么您在这个区块中做得太多了.相反,我建议你推荐将处理推送到函数调用. (3认同)
  • @EdwardKarak:只有你仍然在更高的范围内声明它.如果你对*两个*案例使用大括号,它应该没问题. (2认同)

its*_*att 11

因为它们的范围在开关区.在C#语言规范规定如下:

在switch块中声明的局部变量或常量的范围是switch块.