C#中作用域与初始化的问题
如图1,for循环使用局部值初始化了d,而在循环外试图访问d,产生了错误,这个可以理解。然而如图2,当把for去掉,但同样使d在局部作用域中赋值,为什么这时在外部就可以访...
如图1,for循环使用局部值初始化了d,而在循环外试图访问d,产生了错误,这个可以理解。然而如图2,当把for去掉,但同样使d在局部作用域中赋值,为什么这时在外部就可以访问d了?d的值不应该仍然是局部作用域中的值么?另外,如图3,为什么当这段语句处于死循环中时,就可以通过编译?可以看到后面的Console处于不可访问状态,是不是C#编译器只考虑可以访问的代码的正确性,无视根本访问不到的代码?
展开
2个回答
展开全部
根据编译时的情况来看,for 块里的代码到底会不会执行,是未知的,因为 for 的第二项条件(i != 2)是否为 true 是要等到运行时才能知道的,编译时不可能知道
那也就是说,因为编译时对 d 的初次赋值是否会发生是不确定的,所以之后的代码编译就会出错
而你第二张图的代码,那个块里的代码肯定会被执行的,所以编译就不会出错
至于第三张图,我想或许是因为编译器把 while(true) 看作是一定会执行的,所以也不会出错了
那也就是说,因为编译时对 d 的初次赋值是否会发生是不确定的,所以之后的代码编译就会出错
而你第二张图的代码,那个块里的代码肯定会被执行的,所以编译就不会出错
至于第三张图,我想或许是因为编译器把 while(true) 看作是一定会执行的,所以也不会出错了
更多追问追答
追问
按这么理解确实说得通。但是从作用域的角度解释,书上说for循环里对d的初始化是用的局部变量,出了局部作用域,在外部就无法获取d的内容了。那为什么普通的局部作用域不可以达到这样的效果呢?
追答
当然可以获取 d 啊,因为你的 d 是在作用域外声明的啊
除非,你在 for 块里又定义一个同名的 d,那这个 d 就会覆盖作用域外的 d
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询