有关C#中变量作用域问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 12:57:08
我今天突然发现了一个在C#中奇怪的现象,百思不得其解,请各位高手指点下,详细点,兄弟是初学者,谢了。
问题:

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int i;
string test;//第一行
for (i = 0; i < 10; i++)
{
test = "line";
Console.WriteLine(test);
}
Console.WriteLine(test );
Console.ReadKey();
}
}
}

调试不成功 错误提示是 “ 使用了未赋值的局部变量“test” ”
如果说是还没给第一行的test 赋值的话
但为什么这样后又可以了:

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//int i;
string test;//第一行
// for (i = 0; i < 10; i++)
{
test = "line";
Console.WriteLine(test)

兄弟 其实可以这样理解的 楼上的那些人都讲得太复杂了 变量的作用域其实就是作用在包括变量的花括号和嵌套在其中的花括号里 至于第二个那个花括号形同虚设罢了

楼上几位都是高手啊。够专业。哈哈

我也来解释一下啊,我用点通俗的语言。

第一个例子,赋值写在了循环体里面,而循环体的内容是有可能不被执行的(如果循环条件一次都不能满足的话),由于编译程序无法判断你的循环体是否100%会至少执行一次,因此,他会提示循环体后面的那个输出语句可能输出了没有赋值的变量。这就是提示给你错误的原因。

第二个例子很明显,程序按顺序执行。变量test 100% 的被赋值了,因为编译程序按顺序进行编译的时候发现test在输出之前确实执行到了为其赋值的语句啊。所以不会出现编译错误。

yingg应可以啊..?

string test;
如果在{}中赋值,编译器视为“可能”条件,即可能赋了值也可能没赋
所以要想在{}外使用,或者强制赋值(string test; ... test="";)或者赋初值(string test="";)

关键点:我们定义一个字符串变量后,在使用这个变量之前,如果没给它赋值,是不被允许的。
一个循环(while,for,if道理一样),是要先满足某个条件后,才执行里面的语句块。而条件有两种结果,真、假。
提醒下,它报的错是在第二个Console.WriteLine(test )报的错。
第一段程序给test赋值是在循环里面,既然是在循环里面,就有可能被赋值,或没赋值。只有保证赋值后才行。即使你这样写 while(true),条件永远为真,逻辑上是肯定给test赋值了,但是注意了,电脑不是人脑,它不会管你逻辑正不正确。只要理论上test没被赋值,电脑就给你判死刑。
第二段程序中因为把 for() 给注释掉了,它就不是循环了,不需要判断符不符合条件了。那两个大括号就只是摆设,没起作用,test理论上肯定被赋值,所以就能通过编译。
我写两段小代码
///////////////代码1
if(true) <