H_J_H

------专用杂物房
posts - 26, comments - 1, trackbacks - 0, articles - 119

需要注意变量作用域的使用

Posted on 2005-12-28 14:36 H_J_H 阅读(82) 评论(0)  编辑 收藏 引用
        对于变量的作用域大家可能都很清楚,即变量的作用域包含定义它们的代码块和直接嵌套在其中的代码块。其实也可以应用到其他代码块上,例如分之和循环的代码块上,但是这里有一个需要注意的地方,请看下面这个例子:
1int i;
2for(i=0;i<10;i++)
3{
4    string text = "Line" + Convert.ToString(i);
5    Console.WriteLine("{0}",text);
6}

7Console.WriteLine("Last text output in loop:{0}",text);

        编译会发现,编译通不过,而且报出错误“名称“text”在类或命名空间“Ch06Ex03.Class1”中不存在”,这里比较容易理解,因为在for循环外确实没有定义text变量,在退出循环后就被释放掉了,再使用它就是使用了一个未定义的变量所以会报错。我们修改一下,请看下一个例子:
1int i;
2string text;
3for(i=0;i<10;i++)
4{
5    text = "Line" + Convert.ToString(i);
6    Console.WriteLine("{0}",text);
7}

8Console.WriteLine("Last text output in loop:{0}",text);

        我们在循环块外定义的变量text,这样可以在Console.WriteLine时引用到这个变量,但是编译时还是会报错“使用了未赋值的局部变量“text””,这个错误是提示变量在使用前要被声明并初始化。这样我们就看到了这个例子中的问题,变量text是在for循环块中被初始化的,而赋给text变量的值在退出循环块时就丢失了。在循环体中程序认为text变量有值,而我们确实也为其赋值了,而在退出循环后程序确认为text变量没有被赋值,这是因为变量text是在循环体中被初始化的,这个初始化仅在循环块中起作用,在推出循环后就又变回没有被初始化的状态,所以会报错。我们再进行一次修改:
1int i;
2string text = "";
3for(i=0;i<10;i++)
4{
5    text = "Line" + Convert.ToString(i);
6    Console.WriteLine("{0}",text);
7}

8Console.WriteLine("Last text output in loop:{0}",text);

        这时,程序会正常编译通过,而且text也是在外部被声明并初始化,而使用时也是在变量相应的作用域中。
        对于这种情况的解释,其实涉及在初始化变量text时分配给变量text的内存空间,其实任何变量都是这样的。仅是对于变量的声明,系统并不会分配给它相应的内存空间,系统仅是知道以后将会使用到这个变量。只有在给这个变量进行初始化或赋值时(其实第一次赋值就是对变量的初始化),系统在真正按照声明时变量的类型给变量分配相应的存储空间。就像本例中一样,在循环时对变脸进行了初始化操作,这时在循环执行过程中,这个变量占据了一块系统分配给它的存储空间,但是一旦退出循环,系统就收回了这块存储空间,所以会出现这种错误。
        最后,建议大家在使用变量的时候,在声明变量的同时尽可能对其初始化,如果不能同时初始化也一定要在初始化后再使用这个变量。谢谢大家的支持:)如有问题偶会及时改正的,厚厚~~~


努力学习的熊 2005-12-28 14:36
只有注册用户登录后才能发表评论。