















那么和下面这段代码相比较:












同样变量 int i 也是声明于for循环的外部,但是最后却可以通过Console.WriteLine()来输出这个i的值。通过查看反编译的IL代码发现,其实这个变量 i 是在for结构的循环体外部被初始化的,IL代码如下:






















而上面的例子中,变量 int val 实际上是在for结构的循环体内部初始化的,通过查阅《C#入门经典》找到了答案,下面引用书中的原文:
“实际上任何变量,只声明一个简单的变量类型,并不会引起其他的变化,只有在给变量赋值后,这个值才占用一块内存空间。如果这种占据内存空间的行为在循环中发生,该值实际上被定义为一个局部值,在循环的外部会超出其作用域,从而失去作用。在循环外部赋值可以确保该值是主体代码的局部值,在循环内部它仍处于作用域中。”
比较奇怪的时,在上面第一段代码中,如果注释掉Console.WriteLine(val);这句编译可以通过,并且调试时发现,在for循环结束后仍然可以通过“即时窗口”调到该变量val的值。(如图)
实际上CLR允许任何语法正确的代码,其实这个只是C#编译器的逻辑检查功能罢了,它保证了程序的正确性,它认为FOR可以一次也不循环,也就有可以变量没赋值就使用,这样程序也就有可能会出现程序员不预期的效果,这是编译器的辅助功能,当然也可以通过设置编译器选项,降低编译器的代码安全检查标准来避免这个问题,但是一般来说并不推荐这样做。