static (C# 參考)

static 修飾詞 (Modifier) 可用來宣告靜態成員,此成員屬於型別本身,並不隸屬任何一個物件。 static 修飾詞可以用於類別、欄位、方法、屬性、運算子、事件及建構函式 (Constructor),但是不能用於索引子 (Indexer)、解構函式 (Destructor) 或類別以外的型別。 如需詳細資訊,請參閱靜態類別和靜態類別成員 (C# 程式設計手冊)

範例

下列類別是宣告為 static,而且只包含 static 方法:

    static class CompanyEmployee
    {
        public static void DoSomething() { /*...*/ }
        public static void DoSomethingElse() { /*...*/  }
    }

常數或型別宣告隱含靜態成員。

靜態成員無法經由執行個體來參考。 相反地,它需要經由型別名稱來參考。 例如,請參考下列類別:

    public class MyBaseC
    {
        public struct MyStruct
        {
            public static int x = 100;
        }
    }

若要參考靜態成員 x,請使用完整的名稱 MyBaseC.MyStruct.x,除非它是從相同範圍來存取:

Console.WriteLine(MyBaseC.MyStruct.x);

雖然一個類別的執行個體包含類別所有執行個體欄位的分別複本,但是每一個靜態欄位只有一個複本。

不可以使用這個參考靜態方法或屬性存取子。

如果類別套用了 static 關鍵字,則此類別的所有成員必定為靜態。

類別和靜態類別都可能具有靜態建構函式。 靜態建構函式會在程式啟動與類別具現化 (Instantiated) 之間的某個時間點進行呼叫。

注意事項注意事項

static 關鍵字的用法比在 C++ 中具有更多限制。 若要與 C++ 關鍵字進行比較,請參閱 Static (C++)

為了示範靜態成員,以代表公司員工的類別為例。 假設此類別包含一方法來計算員工人數和一個欄位來儲存員工人數。 此方法和欄位不屬於任何執行個體員工。 相反的,他們屬於公司類別。 因此,他們應該宣告成類別的靜態成員。

這個範例讀取新員工的名字和 ID、然後累加員工人數,並且顯示此新員工的資訊以及員工新人數。 為了簡化,這個程式從鍵盤讀取目前的員工人數。 在實際應用上,這項資訊應從檔案讀取。

    public class Employee4
{
    public string id;
    public string name;

    public Employee4()
    {
    }

    public Employee4(string name, string id)
    {
        this.name = name;
        this.id = id;
    }

    public static int employeeCounter;

    public static int AddEmployee()
    {
        return ++employeeCounter;
    }
}

class MainClass : Employee4
{
    static void Main()
    {
        Console.Write("Enter the employee's name: ");
        string name = Console.ReadLine();
        Console.Write("Enter the employee's ID: ");
        string id = Console.ReadLine();

        // Create and configure the employee object:
        Employee4 e = new Employee4(name, id);
        Console.Write("Enter the current number of employees: ");
        string n = Console.ReadLine();
        Employee4.employeeCounter = Int32.Parse(n);
        Employee4.AddEmployee();

        // Display the new information:
        Console.WriteLine("Name: {0}", e.name);
        Console.WriteLine("ID:   {0}", e.id);
        Console.WriteLine("New Number of Employees: {0}",
                      Employee4.employeeCounter);
    }
}
    /*
    Input:
    Matthias Berndt
    AF643G
    15
    Sample Output:
    Enter the employee's name: Matthias Berndt
    Enter the employee's ID: AF643G
    Enter the current number of employees: 15
    Name: Matthias Berndt
    ID:   AF643G
    New Number of Employees: 16
    */

這個範例會示範,雖然您可以使用其他尚未宣告的靜態欄位來初始化靜態欄位,但是在明確指派值給該靜態欄位之前,結果都會是未定義的。

class Test
{
   static int x = y;
   static int y = 5;

   static void Main()
   {
      Console.WriteLine(Test.x);
      Console.WriteLine(Test.y);

      Test.x = 99;
      Console.WriteLine(Test.x);
   }
}
/*
Output:
    0
    5
    99
*/

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格。 語言規格是 C# 語法和用法的決定性來源。

請參閱

參考

C# 關鍵字

修飾詞 (C# 參考)

靜態類別和靜態類別成員 (C# 程式設計手冊)

概念

C# 程式設計手冊

其他資源

C# 參考