111,098
社区成员




看看代码,当i=2时,直接执行case 2了,但此时aArray应是未定义类型吧???未声明的实例竟然可以直接使用???
也许有人说case 1里声明了,那岂不是说,case1也执行了?
挺基础的问题,哪位大神受累解答一下?
一般情况下,变量声明确实是执行才赋值,这个 switch case 应该是特例,提前就把变量给声明了。
你可以用一个自定义类替代这个变量类型,让这个类初始化的时候往 console 写日志。
看下运行到哪一句的时候,这个自定义类被创建了。
我猜测这种原因有二:
⒈编译器并不是逐行执行的,而是一个块一个块执行的。
一个花括号就是一个语句块。
⒉C#编译器的特殊优化。
运行时(Runtime)会给语句块分配一个变量表,用于记录该“局部”的变量。
可惜我对 IL 中间语言也不是很懂,拿到底层代码一看就知道了
变量的范围是花括号,如果你把上面打个花括号看看。你看他还让你用不让你用
他不会让你用了,计算机么,不会骗人的。写规则的人写的是那个规则,他就按那个规则判定。
而C#那个写规则的人,认为变量范围是花括号的
比如下面的代码,他不让你用了把
int i = 2;
switch (i)
{
case 1:
{
var a = 1;
break;
}
case 2:
a = 2;
break;
}
好,你知道这个规则了。那么还有反例对吧。都说方法内不准重复定义变量对把。但是我们说规则么,如果我符合规则。你猜可以不可以重复定义呢??你会发现我们又可以重复定义变量了
{
int i = 2;
}
{
int i = 3;
}
case 1 并没有执行。
aArray 只是在 case 1 中作了声明而已。
如下图可以看得非常清楚。
如果希望彻底避免这种情况,可以用 {} 加在 case 前后, 类似下面:
你看,下面的再引用就是直接出错了。