需要注意变量作用域的使用
2005-12-28 14:36
295 查看
对于变量的作用域大家可能都很清楚,即变量的作用域包含定义它们的代码块和直接嵌套在其中的代码块。其实也可以应用到其他代码块上,例如分之和循环的代码块上,但是这里有一个需要注意的地方,请看下面这个例子:
1
int i;
2
for(i=0;i<10;i++)
3
{
4
string text = "Line" + Convert.ToString(i);
5
Console.WriteLine("{0}",text);
6
}
7
Console.WriteLine("Last text output in loop:{0}",text);
编译会发现,编译通不过,而且报出错误“名称“text”在类或命名空间“Ch06Ex03.Class1”中不存在”,这里比较容易理解,因为在for循环外确实没有定义text变量,在退出循环后就被释放掉了,再使用它就是使用了一个未定义的变量所以会报错。我们修改一下,请看下一个例子:
1
int i;
2
string text;
3
for(i=0;i<10;i++)
4
{
5
text = "Line" + Convert.ToString(i);
6
Console.WriteLine("{0}",text);
7
}
8
Console.WriteLine("Last text output in loop:{0}",text);
我们在循环块外定义的变量text,这样可以在Console.WriteLine时引用到这个变量,但是编译时还是会报错“使用了未赋值的局部变量“text””,这个错误是提示变量在使用前要被声明并初始化。这样我们就看到了这个例子中的问题,变量text是在for循环块中被初始化的,而赋给text变量的值在退出循环块时就丢失了。在循环体中程序认为text变量有值,而我们确实也为其赋值了,而在退出循环后程序确认为text变量没有被赋值,这是因为变量text是在循环体中被初始化的,这个初始化仅在循环块中起作用,在推出循环后就又变回没有被初始化的状态,所以会报错。我们再进行一次修改:
1
int i;
2
string text = "";
3
for(i=0;i<10;i++)
4
{
5
text = "Line" + Convert.ToString(i);
6
Console.WriteLine("{0}",text);
7
}
8
Console.WriteLine("Last text output in loop:{0}",text);
这时,程序会正常编译通过,而且text也是在外部被声明并初始化,而使用时也是在变量相应的作用域中。
对于这种情况的解释,其实涉及在初始化变量text时分配给变量text的内存空间,其实任何变量都是这样的。仅是对于变量的声明,系统并不会分配给它相应的内存空间,系统仅是知道以后将会使用到这个变量。只有在给这个变量进行初始化或赋值时(其实第一次赋值就是对变量的初始化),系统在真正按照声明时变量的类型给变量分配相应的存储空间。就像本例中一样,在循环时对变脸进行了初始化操作,这时在循环执行过程中,这个变量占据了一块系统分配给它的存储空间,但是一旦退出循环,系统就收回了这块存储空间,所以会出现这种错误。
最后,建议大家在使用变量的时候,在声明变量的同时尽可能对其初始化,如果不能同时初始化也一定要在初始化后再使用这个变量。谢谢大家的支持:)如有问题偶会及时改正的,厚厚~~~
本文出自 “努力学习的小熊” 博客,转载请与作者联系!
1
int i;
2
for(i=0;i<10;i++)
3
{
4
string text = "Line" + Convert.ToString(i);
5
Console.WriteLine("{0}",text);
6
}
7
Console.WriteLine("Last text output in loop:{0}",text);
编译会发现,编译通不过,而且报出错误“名称“text”在类或命名空间“Ch06Ex03.Class1”中不存在”,这里比较容易理解,因为在for循环外确实没有定义text变量,在退出循环后就被释放掉了,再使用它就是使用了一个未定义的变量所以会报错。我们修改一下,请看下一个例子:
1
int i;
2
string text;
3
for(i=0;i<10;i++)
4
{
5
text = "Line" + Convert.ToString(i);
6
Console.WriteLine("{0}",text);
7
}
8
Console.WriteLine("Last text output in loop:{0}",text);
我们在循环块外定义的变量text,这样可以在Console.WriteLine时引用到这个变量,但是编译时还是会报错“使用了未赋值的局部变量“text””,这个错误是提示变量在使用前要被声明并初始化。这样我们就看到了这个例子中的问题,变量text是在for循环块中被初始化的,而赋给text变量的值在退出循环块时就丢失了。在循环体中程序认为text变量有值,而我们确实也为其赋值了,而在退出循环后程序确认为text变量没有被赋值,这是因为变量text是在循环体中被初始化的,这个初始化仅在循环块中起作用,在推出循环后就又变回没有被初始化的状态,所以会报错。我们再进行一次修改:
1
int i;
2
string text = "";
3
for(i=0;i<10;i++)
4
{
5
text = "Line" + Convert.ToString(i);
6
Console.WriteLine("{0}",text);
7
}
8
Console.WriteLine("Last text output in loop:{0}",text);
这时,程序会正常编译通过,而且text也是在外部被声明并初始化,而使用时也是在变量相应的作用域中。
对于这种情况的解释,其实涉及在初始化变量text时分配给变量text的内存空间,其实任何变量都是这样的。仅是对于变量的声明,系统并不会分配给它相应的内存空间,系统仅是知道以后将会使用到这个变量。只有在给这个变量进行初始化或赋值时(其实第一次赋值就是对变量的初始化),系统在真正按照声明时变量的类型给变量分配相应的存储空间。就像本例中一样,在循环时对变脸进行了初始化操作,这时在循环执行过程中,这个变量占据了一块系统分配给它的存储空间,但是一旦退出循环,系统就收回了这块存储空间,所以会出现这种错误。
最后,建议大家在使用变量的时候,在声明变量的同时尽可能对其初始化,如果不能同时初始化也一定要在初始化后再使用这个变量。谢谢大家的支持:)如有问题偶会及时改正的,厚厚~~~
本文出自 “努力学习的小熊” 博客,转载请与作者联系!
相关文章推荐
- 需要注意变量作用域的使用
- C++ 构造函数使用 ":成员变量(形参)" 的形式给类里面成员变量赋值,如果成员变量和形参是指针,那么需要注意的事项
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- j2ee高并发时使用全局变量需要注意的问题
- 使用Java中的final变量需要注意的地方。
- 使用Java中的final变量需要注意的地方
- 使用Java中的final变量需要注意的地方。
- 数组名作为变量使用时需要注意的陷阱
- 使用Java中的final变量需要注意的地方。
- 5.1 Python 函数-默认参数,*args,**kwargs的使用;作用域-局部空间使用全局变量需要注意的事项等
- 使用Java中的final变量需要注意的地方
- SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题
- 使用Java中的final变量需要注意的地方。
- 使用Java中的final变量需要注意的地方。
- 32位系统上使用64位变量需要注意
- 使用CustomValidator 控件时需要注意的地方
- 使用auto_ptr需要注意的事项
- C#语言中变量的使用和注意事项
- VFW中使用capSetVideoFormat需要注意的
- 使用SQL Server 2014 In-Memory 内存数据库时需要注意的地方