Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#switch语句中的每个case/default块都带有花括号?_C#_Switch Statement - Fatal编程技术网

C#switch语句中的每个case/default块都带有花括号?

C#switch语句中的每个case/default块都带有花括号?,c#,switch-statement,C#,Switch Statement,通常,C#中的switch语句如下所示 switch (sh) { case 1: DoThis(); DoThat(); break; case 2: DoThis(); DoThat(); break; default: DoThis(); DoThat(); break; } 但有史以来第一次,我看到有人在switch语句中为每个case语句使用花括号,如下

通常,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 (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;
    }
}
这将为每个分支创建自己的作用域,并且可以很好地编译


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

我相信这是旧代码的残余。我记得在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();
   }  
} 

中断只会离开开关,但在离开支架后会离开开关。

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

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
块)


在您的示例中,不需要作用域,我不会在一般情况下使用它们,因为这是“不寻常”的代码。不寻常通常意味着混乱。你的问题就是这种观点的证明(这是一种观点,只是为了避免这里的宗教战争),因为这种结构让你困惑不已,所以你可以提出这个问题。

不需要它们。您可以用大括号将任何代码包围起来,以创建新的嵌套代码区域。此外,当您有
switch(){case:}
语句时。。。我知道代码块会创建嵌套区域并限制变量的范围,但我在上面的switch语句中看不到任何原因。Thanks@pixel没有句法上的原因。可能是此人为了使其更具可读性而使用的偏好。我自己不喜欢大括号。@pixel所以你理解代码块在使用时的效果,不管上下文如何,但不知道在这个特定上下文中使用它们的效果是什么?代码缩进总是让我恼火,
case
子句与
开关保持左对齐。我喜欢它们,就像你的例子一样。:)