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) { int a = 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; } }