1、int i;
for (i = 0; i < 10; i++)
{
string text = "Line" + Convert.ToString(i);
Console.WriteLine("{0}", text);
}
Console.WriteLine("Last text output in Loop :{0}.", text);
失败,字符串变量text是for循环的局部变量,这段代码不能编译,因为在该循环外部调用的Console.WriteLine()试图使用该变量text,这超出了循环的作用域。
2、 int i;
string text;
for (i = 0; i < 10; i++)
{
text = "Line" + Convert.ToString(i);
Console.WriteLine("{0}", text);
}
Console.WriteLine("Last text output in Loop :{0}.", text);
失败,变量必须在使用前声明和初始化,而text是在for循环中初始化,赋给text的值在循环退出时就丢失了。
3、 int i;
string text=" ";
for (i = 0; i < 10; i++)
{
text = "Line" + Convert.ToString(i);
Console.WriteLine("{0}", text);
}
Console.WriteLine("Last text output in Loop :{0}.", text);
Console.ReadKey();
这次text是在循环外初始化的,可以访问它的值。
以上的情况是分配给text变量的内存空间,实际上任何变量都是这样。只有声明一个简单的变量类型,并不会引起其他的变化。只有在给变量赋值后,这个值才占用一块内存空间。如果这种占据内存空间的行为在循环中发生,该值实际上定义为一个局部值,在循环的外部会超出其作用域。
即使变量本身没有局部化到循环上,循环所包含的值也局部化到该循环上。但是在循环外部赋值可以确保该值是主体代码的局部值,在循环内部它仍处于其作用域中。这意味着变量在退出主体代码块之前是没有超出作用域的,所以可以在循环外部访问它的值。