跳到主要内容

C# 变量作用域

提示
  1. 变量作用域的概念:在C#中,变量作用域定义了变量在代码的哪些部分可用,分为类级、方法级和块级作用域。
  2. 类级变量作用域:类级变量(也称为字段)在类内部声明,可以在整个类中的任何方法或构造函数内访问,但不能在静态方法中访问非静态类级变量。
  3. 方法级和块级变量作用域:方法级变量仅在定义它们的方法内可访问,而块级变量(如在循环或条件语句内声明的变量)只能在定义它们的特定块内访问。

变量作用域指的是变量在代码的某些部分是否可用。

在 C# 中,变量有三种类型的作用域:

  • 类级作用域
  • 方法级作用域
  • 块级作用域

C# 类级变量作用域

在 C# 中,当我们在类内部声明变量时,该变量可以在类内部访问。这被称为类级变量作用域

类级变量被称为字段,它们在类的方法、构造函数和块之外声明。例如,

using System;
namespace VariableScope {
class Program {

// 类级变量
string str = "类级";

public void display() {
Console.WriteLine(str);
}

static void Main(string[] args) {
Program ps = new Program();
ps.display();

Console.ReadLine();
}
}
}

输出

类级

在上述示例中,我们在 Program 类内初始化了一个名为 str 的变量。

由于它是类级变量,我们可以从类内的方法中访问它。

public void display() {
Console.WriteLine(str);
}

这是因为类级变量在整个类中都是可访问的。

注意:我们不能通过静态方法访问类级变量。例如,假设我们在 Program 类内有一个静态方法。

static void display2() {

// 访问类级变量
// 会引起错误
Console.WriteLine(str);
}

方法级变量作用域

当我们在方法内声明变量时,该变量不能在方法外部访问。这被称为方法级变量作用域。例如,

using System;

namespace VariableScope {
class Program {

public void method1() {
// 方法内声明变量
string str = "方法级";
}

public void method2() {

// 尝试从 method2() 访问 str
Console.WriteLine(str);
}

static void Main(string[] args) {
Program ps = new Program();
ps.method2();

Console.ReadLine();
}
}
}

在上述示例中,我们在 method1() 内创建了一个名为 str 的变量。

// 在 method1() 内
string str = "方法级";

这里,str 是一个方法级变量。因此,它不能在 method1() 外部访问。

然而,当我们尝试从 method2() 访问 str 变量时

// 在 method2 内
Console.WriteLine(str); // 错误代码

我们会得到一个错误。

Error   CS0103     当前上下文中不存在名称 'str'

这是因为方法级变量的作用域仅限于创建它们的方法内。例如,

using System;
namespace VariableScope {
class Program {

public void display() {
string str = "方法内";

// 访问方法级变量
Console.WriteLine(str);
}

static void Main(string[] args) {
Program ps = new Program();
ps.display();

Console.ReadLine();
}
}
}

输出

方法内

这里,我们在 display() 方法内创建并访问了 str 变量。因此,代码运行没有错误。

C# 块级变量作用域

当我们在一个块内(例如 for 循环while 循环if..else)声明变量时,该变量只能在块内访问。这被称为块级变量作用域。例如,

using System;

namespace VariableScope {
class Program {
public void display() {

for(int i=0;i<=3;i++) {

}
Console.WriteLine(i);
}

static void Main(string[]

args) {
Program ps = new Program();
ps.display();

Console.ReadLine();
}
}
}

在上述程序中,我们在 for 循环内初始化了块级变量 i

for(int i=0;i<=3;i++) {

}

由于 i 是块级变量,当我们尝试在 for 循环外部访问该变量时,

// for 循环外部
Console.WriteLine(i);

我们会得到一个错误。

Error**	** CS0103  当前上下文中不存在名称 'i'