对于switch语句中的每个case / default块,使用花括号的C#switch语句?

时间:2017-11-21 17:55:37

标签: c# switch-statement

通常,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; 
   }  
}

为什么这些花括号{}用于上述案例陈述的每个案例和默认块?

为什么需要它们?

有什么区别?

3 个答案:

答案 0 :(得分:5)

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

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;
    }
}

将为每个分支创建自己的范围,它将编译正常。

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

答案 1 :(得分:1)

您有时在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块)。

在你的例子中,不需要范围,我不会在一般情况下使用它们,因为这是"不常见的"码。不寻常通常意味着令人困惑。你的问题是对这种观点的证明(这是一种意见,只是为了避免在这里发生宗教战争),因为这种结构让你很困惑地提出这个问题。

答案 2 :(得分:0)

我相信这是旧代码的遗留问题。我记得在C中,当我没有放下休息时我会陷入下一种情况......

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

注意你也可以

public static void mergeSort1(int[] a) {

    // if the size of the array is greater than 1
    if (a.length > 1) {

        int middle = a.length / 2; // the array is split in half to get a midpoint

        // copy the array into new array called leftArray which goes from 0 the new
        // end-point 'middle'
        int[] leftArray = Arrays.copyOfRange(a, 0, middle);
        // start of rightArray which finishes at the 'middle'
        int[] rightArray = Arrays.copyOfRange(a, middle, a.length);

        // call MergeSort to recursively sort both halves
        mergeSort1(leftArray);
        mergeSort1(rightArray);

        // now merge the sorted halves into sorted array
        merge(a, leftArray, rightArray);
    }
}

休息将离开Switch但离开支架后会离开。