靜態的

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 constructorstatic 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 之前無法通過垃圾收集器執行。

  • 靜態類無法實現介面。