從類的外部訪問靜態成員
在前一章中,我們看到使用點運算符可以從類的外部訪問public實例成員。點運算符由實
例名、點和成員名組成。
就像實例成員,靜態成員也可以使用點運算符從類的外部訪問。但因為沒有實例,所以最常
用的訪問靜態成員的方法使用類名,如下面的代碼所示:
訪問靜態成員的另一種方法根本不需要使用前綴,只需在該成員所屬的類中包含一個using
static聲明,如下所示:
using static System.Console; //在其他成員中包含WriteLine()
using static System.Math; //在其他成員中包含Sqrt()....WriteLien($"The square root of 16 is {Sqrt(16)}");
等價于
using System;...Console.WriteLine($"The square root of 16 is {Math.Sqrt(16)}");
說明 在這兩種訪問靜態成員的方法中進行選擇時,應該考慮哪種方法的代碼對你和維護代碼
的人來說更加清晰易懂。
靜態字段示例
下面的代碼擴展了前文的類D,增加了兩個方法:
- 一個方法設置兩個數據成員的值。
- 另一個方法顯示兩個數據成員的值。
class D
{int Menm1;static int Mem2;public void SetVars(int v1,int v2)//設置值{Menm1=v1;Mem2=v2;//像訪問實例字段一樣訪問它}public void Display(string str){Console.WriteLine("{0}:Mem1={1},Mem2={2}",str,Menm1,Mem2);}
}class Program
{static void Main(){D d1=new D(),d2=new D();//創建兩個實例d1.SetVars(2,4); //設置d1的值d1.Display("d1");d2.SetVars(15,17); //設置d2的值d2.Display("d2");d1.Display("d1"); //再次顯示d1//注意,這時Mem2靜態成員的值已改變}
}
靜態成員的生存期
靜態成員的生命期與實例成員的不同。
- 之前我們已經看到了,只有在實例創建之后才產生實例成員,在實例銷毀之后實例成員
也就不存在了。 - 但是即使類沒有實例,也存在靜態成員,并且可以訪問。
圖7-4闡述了類D,它帶有一個靜態字段Mem2。雖然Main沒有定義類D的任何實例,但它把
值5賦給該靜態字段并毫無問題地把它打印了出來。