C#switch语句中的每个case/default块都带有花括号?
通常,C#中的switch语句如下所示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语句使用花括号,如下
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
子句与开关保持左对齐。我喜欢它们,就像你的例子一样。:)