1)变量的作用域
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo3
{
class Program
{
static void Main(string[] args)
{
for(int i = 0; i < 10; i++)
{
Console.WriteLine(i);
for (int i = 9; i > 0; i--)
{
Console.WriteLine(i);
}
}
}
}
}
错误 1 不能在此范围内声明名为“i”的局部变量,因为这样会使“i”具有不同的含义,而它已在“父级或当前”范围中表示其他内容了
解释:这段代码使用一个for循环打印一个从0到9的数字,再用一个for循环打印从9到1的数字,但由于第二个for循环是嵌套在第一个for循环里面,两个变量i都在第一个for循环的作用域内,编译器无法区分两个变量i,所以编译时程序会报错。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo3
{
class Program
{
static void Main(string[] args)
{
for(int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
for (int i = 10; i > 0; i--)
{
Console.WriteLine(i);
}
}
}
}
解释:这个是正确的程序代码,也是使用for循环打印一个从0到9的数字,打印从9到1的数字,由于两个for循环的变量i都是在自己循环内部声明的,两个i对于循环来说是局部变量,所以编译会通过。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo3
{
class Program
{
static void Main(string[] args)
{
int j = 20;
for (int i = 0; i < 10; i++)
{
int j = 30; //不合法的变量j
Console.WriteLine(i+j);
}
return;
}
}
}
错误 1 不能在此范围内声明名为“j”的局部变量,因为这样会使“j”具有不同的含义,而它已在“父级或当前”范围中表示其他内容了 C:"Documents and Settings"kike2008"My Documents"Visual Studio 2008"Projects"Demo3"Demo3"Program.cs 16 21 Demo3
解释:变量j是在for循环开始前声明的,在执行for循环时应处于其作用域内,在Main方法执行后,变量j才超出其作用域,而第二个变量j在其作用域内,该作用域嵌套在Main方法的作用域内,所以编译器无法区别这两个变量。
(2)字段和局部变量的作用域冲突
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo3
{
class Program
{
static int i = 100;
static void Main(string[] args)
{
int i = 20;
Console.WriteLine(i);
return;
}
}
}
解释:由于在Main方法中,声明的亲变量i隐藏了同名的类级变量,所以代码会编译,执行后打印出20。
(3)引用类变量的写法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo3
{
class Program
{
static int i = 100;
static void Main(string[] args)
{
int i = 20;
Console.WriteLine(Program.i); //引用Program类变量i
return;
}
}
}
{
int i;
for (i = 0 ;i < 10 ;i ++ )
{
string text = " Line " + Covert.ToString(i);
Console.WriteLine( " {0} " ,text);
}
Console.WriteLine( " Last text output in loop:{0} " ,text);
Console.ReadKey();
}
字符串常量text是for循环里面的局部变量,这段代码不能编译,在循环外部调用了该变量,超过了循环的作用域,修改代码如下:
{
int i;
string text;
for (i = 0 ;i < 10 ;i ++ )
{
string text = " Line " + Covert.ToString(i);
Console.WriteLine( " {0} " ,text);
}
Console.WriteLine( " Last text output in loop:{0} " ,text);
Console.ReadKey();
}
这段代码也会失败,是因为声明的变量没有初始化,循环内的初始化在循环结束后失效,修改代码如下:
{
int i;
string text = "" ;
for (i = 0 ;i < 10 ;i ++ )
{
string text = " Line " + Covert.ToString(i);
Console.WriteLine( " {0} " ,text);
}
Console.WriteLine( " Last text output in loop:{0} " ,text);
Console.ReadKey();
}