• 章节:156
  • 访问:1091
  • 时长:00:10:09
  • 日期:2016-10-07 10:40

上面我们说的变量的作用域,也只是函数体之间的问题

但是变量的作用域其实还包括它所在的代码块还有之间嵌套其中的代码块,比如分支if和循环结构的代码块

像下面的代码

int i=0;
for(;i<10;i++)
{
    string name = "北盟网校";
    Console.WirteLine(name);
}
Console.WriteLine(name);

上面这种情况,在for外面使用for里面的name是编译不了的

如果如果想要使用,则需要修改成

int i=0;
string name;
for(;i<10;i++)
{
    name = "北盟网校"+i.ToString();
    Console.WirteLine(name);
}
Console.WriteLine(name);

但是上面代码也会报错,原因是必须在使用变量前对齐进行声明和初始化,因为name在for中初始化的话,赋给text的值在循环代码块退出时丢失的

并且for循环也存在一次都不执行的情况,所以下面的name也可能是未初始化的;

这里其实底层原因的,涉及变量的内存分配的问题,如果学过C++应该知道指针变量的概念,那么就比较好理解了;实际上

当我们声明一个变量比如string name;的时候,执行保存了变量的指针地址而已,还没有给该地址指向一块内存区域,只有赋值后才开辟一块内存空间执行该指针

但是如果在循环体内部初始化赋值的话,那么开辟的内存区域,其实是局部值,而既然是局部值,那么在for的外面则是不能访问局部变量的,尽管你的指针地址是定义在外面;

但是如果在外面初始化的话,那么该变量(因为还是在方法内部的所以还是局部变量)的作用域是可以覆盖循环体内部的,所以在for外部初始化,那么退出了for,该变量还是没有超出作用域;

C#编译器可以检测这些问题的

最好就是声明和初始化后再在循环中使用


    class Program
    {      
        static void Main(string[] args)
        {
            Console.WriteLine(i);//写在前面也是无效的            //for (int i = 0; i < 10; i++)//这个i这样定义那么只在for循环里面才有效            string name;            for (; i < 10; i++)
            {
                name = "北盟网校 www.bamn.cn";
                Console.WriteLine(DateTime.Now.ToShortDateString());
            }
            Console.WriteLine(i);
            Console.WriteLine(name);
            Console.ReadKey();
        }        static int i = 0;//这个放的位置不影响    }