在上一节中,我们介绍了变量的概念以及如何声明变量。当一个变量被声明,意味着在内存中开辟了一段内存,那么,这个变量在源代码中的哪些位置有效?换句话说,哪些代码段可以使用这个变量,这就是指变量的作用域。因为作用域定义了这个变量的可见性和生命周期。
要了解变量的作用域,就必须要了解C#源代码的组织结构。如果把C#比作我们这个真实世界,那么,我引用一个与C#类似的例子。
一个集团由多个子公司构成,一个子公司由多个部门构成,一个部门由多个人构成,一个人由哪些构成?人的四肢五脏六腑等表示他有哪些属性,人能吃饭睡觉打豆豆等表示他具备哪些行为能力。
在VisualStudio中,所以的源代码组织形式是以解决方案统一管理的,所以,VisualStudio的解决方案就好比是一个集团,下面由多个项目构成,每个项目里面由很多的类型(class/struct)、枚举(enum)、委托(delegate)构成,而一个类型由哪些构成?类型分为引用类型和值类型两种,由class关键字定义的类型就是引用类型,由struct定义的类型就是值类型。
如图所示,这是一个解决方案的结构,其中有4个项目,Helloword项目由两个引用类型构成,分别是Person类和Program类。我们以class定义的引用类型为例,阐述变量的作用域问题。
namespace Helloworld
{
internal class Person
{
private string name = string.Empty;
public string Name
{
get { return name; }
set { name = value; }
}
private int age = 0;
public int Age
{
get { return age; }
set { age = value; }
}
public void Write()
{
Console.WriteLine($"你好,我叫{Name},我今年{Age}岁!");
}
public void Print()
{
string name = "杨过";//局部变量,在方法的大括号中有效
int age = 18;//局部变量
Console.WriteLine($"你好,我叫{name},我今年{age}岁!");
}
public void Print(string name,int age)//方法参数,在方法的大括号中有效
{
Console.WriteLine($"你好,我叫{name},我今年{age}岁!");
}
public static int Money = 99999;//静态变量,整个项目中有效
public void Study(int level)
{
for (int i = 0; i < level; i++)
{
//i在for语句中有效
Console.WriteLine($"小龙女的玉女心经已达{i}层");
}
//变量i在这里无效
}
}
//主程序的入口类型
internal class Program
{
//入口函数
static void Main(string[] args)
{
Person persnotallow= new Person();
person.Write();
person.Print();
person.Print("小龙女", 25);
person.Study(10);
Console.WriteLine($"小龙女的 Money = {Person.Money}");
Console.ReadKey();
}
}
}
输出结果
你好,我叫,我今年0岁!
你好,我叫杨过,我今年18岁!
你好,我叫小龙女,我今年25岁!
小龙女的玉女心经已达0层
小龙女的玉女心经已达1层
小龙女的玉女心经已达2层
小龙女的玉女心经已达3层
小龙女的玉女心经已达4层
小龙女的玉女心经已达5层
小龙女的玉女心经已达6层
小龙女的玉女心经已达7层
小龙女的玉女心经已达8层
小龙女的玉女心经已达9层
小龙女的 Money = 99999
结果分析
局部变量作用域,如下面的name和age两个变量,它们位于Print方法中,所以只能在这个方法内有效。
public void Print()
{
string name = "杨过";//局部变量,在方法的大括号中有效
int age = 18;//局部变量
Console.WriteLine($"你好,我叫{name},我今年{age}岁!");
}
全局变量作用域,如下面的name字段成员和age字段成员,它们由private关键字声明,在整个Person内部有效,而Name属性成员和Age属性成员经过public修饰后,其它类型也可以使用。
private string name = string.Empty;
public string Name
{
get { return name; }
set { name = value; }
}
private int age = 0;
public int Age
{
get { return age; }
set { age = value; }
}
静态变量作用域,如下面的Money静态字段成员,可以在整合Helloworld项目中有效,采用类型限定进行调用。
public static int Money = 99999;//静态变量,整个项目中有效
循环变量作用域,如for语句中的i变量,只能在for语句中有效。
public void Study(int level)
{
for (int i = 0; i < level; i++)
{
//i在for语句中有效
Console.WriteLine($"小龙女的玉女心经已达{i}层");
}
//变量i在这里无效
}
总结:变量的作用域与声明它的修饰符和位置相关,总体来说,在遇到不同位置上声明了相同名字的变量后,采用就近有效原则,比如Print方法中定义了name和age局部变量,但在Person类中也定义了name和age字段成员,这里Print方法中只认它内部的name和age局部变量。
当前课程源码下载:(注明:本站所有源代码请按标题搜索)
文件名:048-变量的作用域.zip
链接:https://pan.baidu.com/s/1Bq2lX7cruUbklLwgjGggSw
提取码:byte
——重庆教主 2024年1月24日