在 C#中,把声明为类型级的变量看作是字段,而把在方法中声明的变量看作局部变量。
变量的作用域是指可以访问该变量的代码区域。一般情况下,作用域的范围是规定的:
1. 成员变量的作用域限定该变量所属的类2. 局部变量的作用域限定从声明该变量的语句块开始到对应语句块结束的封闭花括号之间。3. 在 for、while 等语句中声明的局部变量作用域限定在该循环体内。4. 同名的局部变量不能在同一作用域内声明两次。
1. 案列:变量的作用域
public class Program
{ public static void Main()
{ for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
for (int i = 9; i >= 0; i--)
{
Console.WriteLine(i);
}
}
}
这段代码使用一个 for 循环打印出从 0~9 的数字,再打印从 9~0 的数字。
重要的是在同一个方法中,代码中的变量 i 声明了两次。可以这么做的原因是在两次声明中,i 都是在循环内部声明的,所以变量 i 对于循环来说是局部变量。
public static void Main()
{
int j = 20;
for (int i = 0; i < 10; i++)
{
int j = 30; Console.WriteLine(j + i);
}
Console.ReadLine();
}
再看上面的代码,如果试图编译它,就会产生错误。
其原因是:
for 循环之前定义的变量 j 其作用域从定义处开始到 Main 方法结束。
第二个 j 的作用域在循环体的作用域内,该作用域嵌套在 Main 方法的作用域内,编译器无法区别这两个变量 j,所以不允许声明第二个变量 j。
如果字段和局部变量同名,局部变量优先级高于字段变量。
2. 案例:字段与局域变量作用之间的冲突
class Program
{
static int j = 20; //字段
public static void Main()
{
int j = 30; //局部变量 Console.WriteLine(j);
}
}
在 Main 方法中声明的新变量 j 隐藏了同名的类级变量,所以在运行这段代码时,会显示数字 30。
如果要引用类级变量,可以使用语法
this.字段名
或
对象名.字段名
或
类名.字段名
采用哪种格式,与字段和方法的存储类型有关。例如:
class Program
{
static int j = 20; //静态字段
public static void Main()//静态方法
{
int j = 30; //局部变量
Console.WriteLine(Program.j);
}
}
程序的运行结果是输出 20。