C# 静态变量详解:从原理到实战

📅 发布时间:2026/10/9 4:26:29
C# 静态变量详解:从原理到实战
一、为什么需要静态变量在 C# 程序中没有全局变量的概念这意味着所有的成员变量只有该类的实例才能操作这些数据这起到了“信息隐藏”的作用。但有些时候这样做却不是个明智的选择。假设我们要定义一个图书类要求该类能保存图书的数量即每增加一本图书定义一个实例图书的数量应该加 1。如果没有静态变量我们需要将图书的数量保存在每本图书实例里然而这样的变量要在不同图书实例里重复存储。图书实例数量少的话我们还能接受如果图书实例数量较多的话比如成千上万我们无法想象这要造成多少资源如内存、磁盘空间的浪费。更让人无法忍受的是因为图书实例的数量要保存在每本图书实例里该值肯定是不同的。要使这些图书实例中保存的图书实例数量一致我们必须在每增加一本新书生成一个新实例时修改其他所有图书实例中保存的该值。这种局面不会出现因为 C# 中为你准备好了另外一种变量类型静态变量。它在类中类似全局变量保存类的公共信息所有该类的实例对象共享该值。二、静态变量的声明声明静态变量的语法如下访问修饰符 static 数据类型 变量名;这里的访问修饰符跟类的其它成员一样可以是 public、protected、private 或 internal 等。在普通的成员变量前加 static 关键字就变成了静态变量。静态变量和实例变量存储方式不同静态变量在声明开始就一直存储在内存中直到整个程序终止。而实例成员在创建对象时分配内存并存储一个数据副本。所以静态成员变量认为是属于类的而不是对象。三、静态变量与实例变量的区别静态变量与实例变量的区别如下内存分配静态变量在应用程序初始化时就存在于内存当中直到它所在的类的程序运行结束时才消亡而实例变量需要被实例化后才会分配内存。生存周期静态变量生存周期为应用程序的存在周期实例变量的存在周期取决于实例化的类的存在周期。调用方式静态变量只能通过“类.静态变量名”调用类的实例不能调用实例变量当该变量所在的类被实例化后可通过实例化的类名直接访问。共享方式静态变量是全局变量被所有类的实例对象共享即一个实例改变了静态变量的值其他同类的实例读到的就是变化后的值实例变量是局部变量不共享的。访问方式静态成员不能访问实例成员实例成员可以访问静态成员。静态变量在类装载的时候分配内存以后创建的对象都使用的该内存相应的操作也就是对这块内存进行操作。也可以看作是另类的全局变量。所以静态变量的值只会初始化一次后面每次访问都是上次处理过的值即使是在一个函数内部。实例变量每次都初始化。四、静态变量的访问方式静态变量必须使用类名来引用而不能使用类的实例因为静态变量不属于任何实例而是共有的。我们可以打个比方在一个班级中有些物品是个人的我们想使用时必须指出物品的所有者比如说“王三的自行车”在 C# 程序中我们可以使用王三.自行车的格式。有些物品是大家共有的物品不能以个人名义使用而是用班级的名义使用比如班集体出资买的篮球只能说“班级的篮球”而不能说“王三的篮球”。简单来说静态变量是用类名来引用它即类名.静态变量名。五、代码示例示例一静态变量的基本使用using System; class Program { static void Main(string[] args) { // 输出未经定义的静态变量结果为 0也说明了在 C# 中未赋初值的变量系统自动赋为 0 Console.WriteLine(sort.i); // 静态变量的访问方法类名.静态变量名而且还可以在外部操作静态变量 sort.i 5; // 输出 5 Console.WriteLine(sort.i); // 还可以通过构造函数对静态变量赋初值 sort sortTest new sort(); // 输出构造函数中的赋值 3 Console.WriteLine(sort.i); } } class sort { public static int i; public sort() { i 3; } }示例二静态变量与实例变量的对比using System; using System.Collections.Generic; using System.Text; class Program { class Class1 { public static String staticStr Class; public String notstaticStr Obj; } static void Main(string[] args) { // 静态变量通过类进行访问该类所有实例的同一静态变量都是同一个值 Console.WriteLine(Class1s staticStr: {0}, Class1.staticStr); Class1 tmpObj1 new Class1(); tmpObj1.notstaticStr tmpObj1; Class1 tmpObj2 new Class1(); tmpObj2.notstaticStr tmpObj2; // 非静态变量通过对象进行访问不同对象的同一非静态变量可以有不同的值 Console.WriteLine(tmpObj1s notstaticStr: {0}, tmpObj1.notstaticStr); Console.WriteLine(tmpObj2s notstaticStr: {0}, tmpObj2.notstaticStr); Console.ReadLine(); } }六、总结静态变量是 C# 中一种重要的变量类型它属于类而非实例被所有实例共享。理解静态变量与实例变量的区别有助于我们在合适的场景下做出正确的选择当需要保存类的公共信息、实现实例间共享数据时静态变量是最佳选择。