【问题标题】:C# switch statement with curly braces for each case/default block within the switch statement?C# switch 语句与 switch 语句中的每个 case/default 块的花括号?
【发布时间】:2018-05-05 07:14:25
【问题描述】:

通常,C# 中的 switch 语句如下所示

switch (sh)
{
   case 1:
      DoThis();
      DoThat();
      break;
   case 2:
      DoThis();
      DoThat();
      break;
   default:
      DoThis();
      DoThat();
      break;   
}

但是有史以来第一次,我看到有人在如下 switch 语句中为每个 case 语句使用花括号:

switch (sh)
{
   case 1:
   {
      DoThis();
      DoThat();
      break;
   }
   case 2:
   {
      DoThis();
      DoThat();
      break;
   }
   default:
   {
      DoThis();
      DoThat();
      break; 
   }  
}

为什么这些花括号 {} 用于上述 case 语句的每个 case 和默认块?

为什么需要它们?

有什么区别?

【问题讨论】:

  • 不需要它们。您可以用花括号将任何代码括起来以创建新的嵌套代码区域。
  • 当你有一个switch() { case: } 语句时......它使环绕多个语句更易读..
  • 我知道代码块会创建嵌套区域并限制 vars 的范围,但我在上面的 switch 语句中看不到任何原因。谢谢
  • @pixel 没有语法上的原因。可能是这个人用来使其更具可读性的偏好。我自己不喜欢戴牙套。
  • @pixel 因此,您了解代码块在使用时的效果,无论上下文如何,但不知道在此特定上下文中使用它们的效果是什么?跨度>

标签: c# switch-statement


【解决方案1】:

它们不是必需的,但如果您在多个分支中声明具有相同名称的变量,它们会很有用:

switch (sh)
{
    case 1:
        var test = "test";
        Console.WriteLine(test);
        break;
    case 2:
        var test = "test";
        Console.WriteLine(test);
        break;
}

这不会编译,抱怨变量名冲突。但是如果你添加大括号

switch (sh) 
{
    case 1:
    {
        var test = "";
        Console.WriteLine(test);
        break;
    }
    case 2:
    {
        var test = "";
        Console.WriteLine(test);
        break;
    }
}

这将为每个分支创建自己的范围,并且可以正常编译。

有些人习惯了这一点,总是添加括号,即使没有定义任何变量。

【讨论】:

  • 代码缩进总是让我很烦,case 子句与switch 字左对齐。我喜欢它们,就像你的例子一样。 :)
【解决方案2】:

我相信这是旧代码的残余。我记得在 C 中,当我没有休息时,我会在下一个案例中摔倒......

这不再相关,只是代码风格。

注意你也可以这样做

switch (sh)
{
   case 1:
      DoThis();
      DoThat();
      break;
   case 2:
   {
      DoThis();
      DoThat();
   }break; 
   case 3:
   case 4:
   {
      DoThis();
      DoThat();
   }
   case 5:
      goto case 1; 
   default:
   {
      DoThis();
      DoThat();
   }  
} 

break 只会离开 Switch,但会在离开括号后离开。

【讨论】:

    【解决方案3】:

    您有时在switch 语句中遇到的问题是所有案例都在同一范围内。这意味着(例如)您不能在两种情况下使用相同的变量名。考虑一下:

    switch (sh)
    {
        case 1:
            int result = 1;
            return result;
        case 2:
            int result = 2;
            return result;
    }
    

    这将导致编译器错误,因为您在同一范围内声明了两次 result。您可以通过在案例中引入新范围来消除错误:

    switch (sh)
    {
        case 1:
        {
            int result = 1;
            return result;
        }
        case 2:
        {
            int result = 2;
            return result;
        }
    }
    

    考虑到switch 案例有些争议,因为它们引入了额外的复杂性,添加额外的范围会增加混乱。我更喜欢以不会导致所描述问题的方式使用switch 块(通过在案例中保持低代码量并尽量避免使用大的switch 块)。

    在您的示例中,不需要范围,我不会在一般情况下使用它们,因为这是“不寻常的”代码。不寻常通常意味着混乱。您的问题是对该观点的证明(这是一种观点,只是为了避免在这里发生宗教战争),因为这种结构足以让您感到困惑,无法提出这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2015-07-16
      • 1970-01-01
      相关资源
      最近更新 更多