C#中字段可分为实例字段和静态字段
1、实例字段
类的每个实例拥有自己的各个类成员的副本,这些成员称为实例成员。改变一个实例字段的值不会影响任何其它实例中成员的值。
如下例所示,代码声明了一个类D,它带有唯一整型字段Mem1。Main创建了该类的两个实例,每个实例都有自己的字段Mem1的副本,改变一个实例字段副本的值不影响其他实例的副本的值。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace test6 { class Program { static void Main(string[] args) { D d1 = new D(); D d2 = new D(); d1.Mem1 = 10; d2.Mem1 = 28; Console.WriteLine("d1 = {0}, d2 = {1}", d1.Mem1, d2.Mem1); Console.ReadLine(); } } class D { public int Mem1; } }
这段代码的输出为:
2、静态字段
除了实例字段,类还可以拥有静态字段。
静态字段被类的所有实例共享,所有实例都访问同一内存位置。因此,如果该内存位置的值被一个实例改变了,这种改变对所有的实例都可见。可以使用static修饰符将字段声明为静态。
就像实例成员,静态成员可以使用点运算符从类的外部访问,但因为没有实例,所以必须使用类名才能访问,如下代码所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace test6 { class Program { static void Main(string[] args) { D d1 = new D(); D d2 = new D(); d1.SetVars(2, 4); d1.Display("d1"); d2.SetVars(15, 17); d2.Display("d2"); d1.Display("d1"); Console.WriteLine("Mem2 = " + D.Mem2.ToString()); Console.ReadLine(); } } class D { public int Mem1; static public int Mem2; public void SetVars(int v1, int v2) { Mem1 = v1; Mem2 = v2; } public void Display(string str) { Console.WriteLine("{0}: Mem1 = {1}, Mem2 = {2}", str, Mem1, Mem2); } } }
这段代码的输出为:
对于实例成员,只有在实例创建之后才能产生实例成员,在实例销毁之后实例成员也就不存在了。但是即使类没有实例,也存在静态成员,并且可以访问。