靜態的
static
修飾符用於宣告靜態成員,該成員不需要例項化以便被訪問,而是僅通過其名稱(即 DateTime.Now
)訪問。
static
可以與類,欄位,方法,屬性,運算子,事件和建構函式一起使用。
雖然類的例項包含該類的所有例項欄位的單獨副本,但每個靜態欄位只有一個副本。
class A
{
static public int count = 0;
public A()
{
count++;
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
A b = new A();
A c = new A();
Console.WriteLine(A.count); // 3
}
}
count
等於 A
類的例項總數。
static 修飾符還可用於宣告類的靜態建構函式,初始化靜態資料或執行僅需要呼叫一次的程式碼。在第一次引用類之前呼叫靜態建構函式。
class A
{
static public DateTime InitializationTime;
// Static constructor
static A()
{
InitializationTime = DateTime.Now;
// Guaranteed to only run once
Console.WriteLine(InitializationTime.ToString());
}
}
static class
使用 static
關鍵字標記,並且可以用作處理引數的一組方法的有益容器,但不一定需要繫結到例項。由於該類的 static
性質,它無法例項化,但它可以包含一個 static constructor
。static class
的一些功能包括:
- 不能繼承
- 除了
Object
之外,不能繼承任何東西 - 可以包含靜態建構函式,但不包含例項建構函式
- 只能包含靜態成員
- 是密封的
編譯器也很友好,並且會讓開發人員知道類中是否存在任何例項成員。一個示例是在美國和加拿大指標之間轉換的靜態類:
static class ConversionHelper {
private static double oneGallonPerLitreRate = 0.264172;
public static double litreToGallonConversion(int litres) {
return litres * oneGallonPerLitreRate;
}
}
當類宣告為 static 時:
public static class Functions
{
public static int Double(int value)
{
return value + value;
}
}
類中的所有函式,屬性或成員也需要宣告為 static。不能建立類的例項。從本質上講,靜態類允許你建立邏輯上組合在一起的函式包。
由於 C#6 static
也可以與 using
一起使用來匯入靜態成員和方法。它們可以在沒有類名的情況下使用。
老方式,沒有 using static
:
using System;
public class ConsoleApplication
{
public static void Main()
{
Console.WriteLine("Hello World!"); //Writeline is method belonging to static class Console
}
}
using static
的例子
using static System.Console;
public class ConsoleApplication
{
public static void Main()
{
WriteLine("Hello World!"); //Writeline is method belonging to static class Console
}
}
缺點
雖然靜態類可以非常有用,但它們確實有自己的警告:
-
一旦呼叫了靜態類,該類就會載入到記憶體中,並且在解除安裝包含靜態類的 AppDomain 之前無法通過垃圾收集器執行。
-
靜態類無法實現介面。