C#为已声明的vars切换案例行为

时间:2015-07-29 10:30:10

标签: c# switch-statement case declaration

我对在交换机情况下使用术语有点困惑。为什么c#会在case个声明的变量中全部声明,并在switch语句的顶部自动声明它们?

例如:

switch (test)
{
    case "hello":
        string demo = "123";
        break;

    case "world":
        demo = "1234";
        break;

    // not working
    case "hello world":
        demo = demo + "1234567";
        break;
}

我可以在demo下分配变量case "world",即使它是在case "hello下声明的。但是c#似乎只是声明值并且没有设置任何值,因为获取和设置值,(参见case "hello world"下是不可能的。

为什么c#没有为每个case-block打开一个术语/范围,并通过简单的中断或返回来关闭它?

1 个答案:

答案 0 :(得分:4)

因为你没有开始新的范围。就个人而言,我几乎只在我的case语句中使用块范围:

switch (test)
{
    case "hello":
    {
        string demo = "123";
        break;
    }
    case "world":
    {
        var demo = "1234";
        break;
    }
    case "hello world":
    {
        var demo = 34;
        break;
    }
}

在我看来,主要原因是1)简单,2)与C的兼容性。已经有一种语法用于启动新的块范围,并且使用{ ... }。无需添加其他规则"只是因为"。在C#中,对每个case语句都有一个单独的作用域没有多大意义,因为禁止读取可能未分配的变量。

例如,C#中不允许以下内容:

switch (test)
{
  case 1: string demo = "Hello"; goto case 2;
  case 2: demo += " world"; break;
}

当然,对此的解决方案相当简单 - 只需在switch范围之外声明本地,并在需要时为其提供默认值。