我对在交换机情况下使用术语有点困惑。为什么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打开一个术语/范围,并通过简单的中断或返回来关闭它?
答案 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
范围之外声明本地,并在需要时为其提供默认值。