靜態類和靜態成員
1.靜態類
靜態類是使用 static 關鍵字宣告的類,靜態類與普通類的唯一區別在於,靜態類無法進行例項化,即無法使用 new 關鍵字建立類型別的變數。因此,對於類中成員的訪問只可以通過型別來實現。
靜態類中只能夠包含靜態成員,不存在例項建構函式,但可以包含靜態建構函式,靜態類預設會被密封,因此無法繼承靜態類,靜態類也不會派生自其他任何基類(除 Object)。
靜態類可以用作只對輸入引數進行操作並且不必獲取或設定任何內部例項欄位的方法集的方便容器。例如 System.Math 類就是靜態類,其內部成員呼叫例項如下:
double dub = -3.14; Console.WriteLine(Math.Abs(dub)); Console.WriteLine(Math.Floor(dub)); Console.WriteLine(Math.Round(Math.Abs(dub)));// Output: // 3.14 // -4 // 3
在程式中首次引用類之前初始化其欄位並呼叫其靜態建構函式。 靜態建構函式只調用一次,在程式所駐留的應用程式域的生存期內,靜態類會保留在記憶體中。
下面是一個靜態類的簡單例項,實現了取負數的操作:
static class Negative { public static int GetNegative(int i) { return -i; } } class Program { static void Main(string[] args) { inta = Negative.GetNegative(10); Console.WriteLine($"10's negative is {a}"); Console.ReadKey(); } }
輸出結果如下:
10's negative is -10
2.靜態成員
非靜態類可以包含靜態方法、欄位、屬性或事件。 即使未建立類的任何例項,也可對類呼叫靜態成員。 靜態成員始終按類名(而不是例項名稱)進行訪問。
靜態成員只有一個副本存在(與建立的類的例項數無關)。 靜態方法和屬性無法在其包含型別中訪問非靜態欄位和事件,它們無法訪問任何物件的例項變數,除非在方法引數中顯式傳遞它。
靜態方法可以進行過載,但不能進行替代,因為它們屬於類,而不屬於類的任何例項。
雖然欄位不能宣告為 static const,不過 const 欄位在其行為方面本質上是靜態的。 它屬於型別,而不屬於型別的例項。
可在成員的返回型別之前使用 static 關鍵字宣告靜態類成員,如下面的示例所示:
public class Automobile { public static int NumberOfWheels = 4; public static int SizeOfGasTank { get { return 15; } } public static void Drive() { } public static event EventType RunOutOfGas; // Other non-static fields and properties... }
在首次訪問靜態成員之前以及在呼叫建構函式(如果有)之前,會初始化靜態成員。 若要訪問靜態類成員,使用類的名稱指定成員的位置,如下面的示例所示:
Automobile.Drive(); int i = Automobile.NumberOfWheels;
如果類包含靜態欄位,則提供在類載入時初始化它們的靜態建構函式,如下所示:
public class Test { static int age; static Test() { age = 10; } }