靜態域的聲明是使用static修飾符,其它的域都是非靜態域。靜態域和非靜態域分別屬於C#中靜態變量和非靜態變量。
若將一個域說明為靜態的,無論建立多少個該類的實例,內存中只存在一個靜態數據的拷貝。當這個類的第一個實例建立時,域被初始化。以後再進行類的實例化時,不再對其進行初始化,所有屬於這個類的實例共享一個副本。
與之相反,非靜態域在類的每次實例化時,每個實例都擁有一份單獨的拷貝。
下面的例子清楚地反映了二者之間的區別。
程序清單12-1:
using System; public class Count { static int count; int number; public Count(){ count=count+1; number=count; } public void show(){ Console.WriteLine("object{0}:count={1}",number,count); } } class Test { public static void Main(){ Count a=new Count(); a.show(); Console.WriteLine(); Count b=new Count(); a.show(); b.show(); Console.WriteLine(); Count c=new Count(); a.show(); b.show(); c.show(); }
上面的例子中,類Count中域count被聲明為靜態,為所有類的實例所共享。類每進行一次實例化,它的值就加1,這個操作就在構造函數中實現,因而可以用於對系統中類的實例數進行計數。
域number用來存放當前實例的編號。當實被實例化時,在構造函數中就對編號進行賦值,從而可以看出實例化的順序。
方法show用來在屏幕上打印出當前類的實例數,還有類的各個實例的編號。
程序的運行結果應為:
object1:count=1
——————————
object1:count=2
object2:count=2
——————————
object1:count=3
object2.count=3
object3.count=3
從上面的例子中可以看出,無論何時,類的所有實例的count值都是相同的,說明它們共享一個數據,count域只有一個副本。而每個實例的標號都是不同的,一旦實例化,標號就不再變化了。