通常,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;
}
}
为什么这些花括号{
,}
用于上述案例陈述的每个案例和默认块?
为什么需要它们?
有什么区别?
答案 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但离开支架后会离开。