static (C# リファレンス)

更新 : 2007 年 11 月

static 修飾子は、静的メンバの宣言に使用します。静的メンバは、特定のオブジェクトではなく、型自体に属するメンバです。static 修飾子は、クラス、フィールド、メソッド、プロパティ、演算子、イベント、およびコンストラクタと組み合わせて使用できますが、インデクサ、デストラクタ、またはクラス以外の型で使用することはできません。詳細については、「静的クラスと静的クラス メンバ (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

クラスのインスタンスには同クラスのすべてのインスタンス フィールドのコピーが別に含まれますが、各静的フィールドのコピーは 1 つだけです。

静的メソッドまたは静的プロパティ アクセサへの参照には、this は使用できません。

static キーワードをクラスに適用する場合、そのクラスのすべてのメンバが静的であることが必要です。

クラスおよび静的クラスには、静的コンストラクタを含めることができます。静的コンストラクタは、プログラム開始時点からクラスがインスタンス化される時点までの間に呼び出されます。

98f28cdx.alert_note(ja-jp,VS.90).gifメモ :

static キーワードの用法は、C++ の場合よりも制限されています。C++ キーワードと比較するには、「Static (C++)」を参照してください。

静的メンバを例示するために、ある企業の従業員を表すクラスを考えてみます。このクラスには、従業員の数を数えるメソッドと、従業員の数を格納するフィールドがあると仮定します。メソッドおよびフィールドは共に、従業員のどのインスタンスにも属していません。代わりに、それらは企業のクラスに属しています。このため、クラスの静的なメンバとして宣言する必要があります。

この例では、新しい従業員の名前と ID を読み取り、従業員数のカウンタを 1 インクリメントして、新しい従業員の情報および新しい従業員総数を表示します。簡略化のために、この例では現在の従業員数をキーボード入力から読み取っています。実際のアプリケーションでは、ファイルから情報を読み取るようにしてください。

    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# 言語仕様」の次のセクションを参照してください。

  • 1.6.6.3 静的メソッドとインスタンス メソッド

  • 5.1.1 静的変数

  • 10.3.7 静的メンバとインスタンス メンバ

  • 10.5.1 静的フィールドとインスタンス フィールド

  • 10.5.5.1 静的フィールドの初期化

  • 10.6.2 静的メソッドとインスタンス メソッド

  • 10.7.1 静的プロパティとインスタンス プロパティ

  • 10.8.3 静的イベントとインスタンス イベント

  • 10.12 静的コンストラクタ

参照

概念

C# プログラミング ガイド

参照

C# のキーワード

修飾子 (C# リファレンス)

静的クラスと静的クラス メンバ (C# プログラミング ガイド)

その他の技術情報

C# リファレンス