已声明变量的 C# 开关案例行为

C# switch case behaviour for declared vars

我对 switch-case 条件中术语的使用有点困惑。为什么 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;
}

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

为什么 c# 不为每个 case-block 打开一个 term/scope 并用一个简单的 break 或 return 关闭它?

因为您没有开始新的范围。就个人而言,我几乎只在 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 的兼容性。已经有用于启动新块范围的语法,并且使用 { ... }。无需添加其他规则 "just because"。在 C# 中,not 为每个 case 语句设置单独的范围没有多大意义,因为您被禁止读取可能未分配的变量。

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

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

当然,解决这个问题的方法很简单 - 只需在 switch 范围之外声明局部变量,并在需要时给它一个默认值。