在上一节中,我们介绍了变量的概念以及如何声明变量。当一个变量被声明,意味着在内存中开辟了一段内存,那么,这个变量在源代码中的哪些位置有效?换句话说,哪些代码段可以使用这个变量,这就是指变量的作用域。因为作用域定义了这个变量的可见性和生命周期。

要了解变量的作用域,就必须要了解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日