变量的作用域
变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域遵循以下规则:
- 只要类在某个作用域内,其字段(也称为成员变量)也在该作用域内(这句话可以简单的理解为,类中定义的字段可以在类中的任意地方被访问到)。
- 局部变量存在于表示声明该变量的块语句或方法结束的右花括号之前的作用域内。
- 在for、while或类似语句中声明的局部变量存在于该循环体内。
下面,我们通过代码对上边3条规则进行解释:
1 class Person 2 { 3 //定义在类中的变量,称为类的字段或成员变量 4 string name = "CS"; 5 int age = 20; 6 7 public void ShowPersonalInfo() 8 { 9 //定义在方法中的变量,此处的变量i,称为局部变量 10 for (int i = 0; i < 5; i++) 11 { 12 Console.WriteLine("My name is " + name); 13 } 14 for (int i = 0; i < 5; i++) 15 { 16 Console.WriteLine(i.ToString()); 17 } 18 //定义局部变量times 19 int times = 0; 20 while (times < 5) 21 { 22 Console.WriteLine("I'm {0} years old.", age); 23 times++; 24 } 25 Console.WriteLine(times + ":" + "My name is {0},I'm {1} years old !", name, age); 26 } 27 }
通过上面的代码可以看出,Person类中name、age两个字段,以及局部变量times、i的作用域如下图所示:
图 2‑3 各变量的作用域
局部变量的作用域冲突
在大型的程序中,在不同部分为不同的变量使用相同的变量名很常见。只要变量的作用域是程序的不同部分,就不会有问题,也不会产生多义性。但要注意,同名的局部变量不能在同一作用域内声明两次。
错误尝试:下面这几种情况都是局部变量作用域发生冲突的情况
例 2-2:
1 public void ShowPersonalInfo() 2 { 3 int variable = 20; 4 for (int i = 0; i < 5; i++) 5 { 6 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 7 } 8 int variable = 30; 9 }
由于两个同名的局部变量variable的作用域一样,所以可以看到如下错误提示:
图 2‑4 局部变量的作用域及错误提示
例 2-3:
1 public void ShowPersonalInfo() 2 { 3 int i = 20; 4 for (int i = 0; i < 5; i++) 5 { 6 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 7 } 8 }
由于两个同名局部变量i的作用域存在包含关系,所以可以看到以下错误提示:
图 2‑5 局部变量的作用域及错误提示
例 2-4:
1 public void ShowPersonalInfo() 2 { 3 for (int i = 0; i < 5; i++) 4 { 5 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 6 } 7 int i = 20; 8 }
由于两个同名局部变量i的作用域存在包含关系,所以可以看到以下错误提示:
图 2‑6 局部变量的作用域及错误提示
字段和局部变量的作用域冲突
某些情况下,可以区分名称相同、作用域相同的变量。C#在变量之间有一个基本的区分,它把在类型级别声明的变量看作字段,而把方法中声明的变量看做局部变量。
例 2-5:
1 class Person 2 { 3 //定义在类中的变量,称为类的字段或成员变量 4 string name = "CS"; 5 int age = 20; 6 7 public void ShowPersonalInfo() 8 { 9 //定义名称相同的局部变量 10 int age = 30; 11 string name = "CS2"; 12 //局部变量隐藏了同名字段的值,此处的输出结果是”My name is CS2,I'm 30 years old !" 13 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 14 } 15 }
虽然同名变量的作用域存在包含关系,但是由于一个是字段,一个是局部变量,所以上述代码是没有问题的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗