为什么在C#switch语句中,对于在多种情况下使用的变量,你只在第一种情况下声明它?
例如,以下引发错误“已在此范围中定义名为'variable'的局部变量”。
switch (Type)
{
case Type.A:
string variable = "x";
break;
case Type.B:
string variable = "y";
break;
}
但是,根据逻辑,如果类型为Type.B
,则不应该触发初始声明。 switch语句中的所有变量是否都存在于单个作用域中,是否在处理任何逻辑之前创建/分配它们?
答案 0 :(得分:199)
如果您想要一个作用于特定大小写的变量,只需将大小写括在它自己的块中:
switch (Type)
{
case Type.A:
{
string variable = "x";
/* Do other stuff with variable */
}
break;
case Type.B:
{
string variable = "y";
/* Do other stuff with variable */
}
break;
}
答案 1 :(得分:41)
我认为它与变量的整体范围有关,它是在交换机级别定义的块级范围。
就个人而言,如果你在一个开关中为某个东西设置一个值,它真的有任何好处,那么无论如何你都希望在交换机之外声明它。
答案 2 :(得分:31)
是的,范围是整个交换机块 - 不幸的是,IMO。但是,您始终可以在单个案例中添加大括号,以创建较小的范围。至于它们是否被创建/分配 - 堆栈帧有足够的空间用于方法中的所有局部变量(不考虑捕获变量的复杂性)。它不像在方法执行期间分配空间。
答案 3 :(得分:10)
因为它们的范围在交换机块上。 C# Language Specification声明如下:
在开关块中声明的局部变量或常量的范围是开关块。
答案 4 :(得分:0)
答案 5 :(得分:-2)
初始化发生在案例中,但声明在范围的顶部有效地完成。 (伪码)
switch (Type)
{
string variable;
case Type.A:
variable = "x";
break;
case Type.B:
variable = "y";
break;
}
答案 6 :(得分:-2)
“在我的Daaaaays ......”
swicth
是一个非常原始的程序实现,从C
本身的年龄开始(甚至在C++
之前)。
整个switch
是一个块,用作范围包含的GOTO:
(因此:
中的case
。如果您参加了一些汇编程序,那可能看起来很熟悉。
这就是为什么switch
在与Enum
结合使用时最有用,而不是在每个break
中使用case
switch(mood)
{
case Mood.BORED:
case Mood.HAPPY:
drink(oBeer) // will drink if bored OR happy
break;
case Mood.SAD: // unnecessary but proofs a concept
default:
drink(oCoffee)
break;
}