static (C# リファレンス)static (C# Reference)

このページでは、static 修飾子キーワードについて説明します。This page covers the static modifier keyword. static キーワードも using static ディレクティブに含まれます。The static keyword is also part of the using static directive.

static 修飾子は、静的メンバーの宣言に使用します。静的メンバーは、特定のオブジェクトではなく、型自体に属するメンバーです。Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. static 修飾子は static クラスの宣言に使用できます。The static modifier can be used to declare static classes. クラス、インターフェイス、構造体では、static 修飾子をフィールド、メソッド、プロパティ、演算子、イベント、コンストラクターに追加できます。In classes, interfaces, and structs, you may add the static modifier to fields, methods, properties, operators, events, and constructors. static 修飾子はインデクサーおよびファイナライザーと併用できません。The static modifier can't be used with indexers or finalizers. 詳細については、「静的クラスと静的クラス メンバー」を参照してください。For more information, see Static Classes and Static Class Members.

C# 8.0 以降では、ローカル関数static 修飾子を追加できます。Beginning with C# 8.0, you can add the static modifier to a local function. 静的なローカル関数では、ローカル変数やインスタンスの状態をキャプチャすることはできません。A static local function can't capture local variables or instance state.

C# 9.0 以降では、static 修飾子をラムダ式または匿名メソッドに追加できます。Beginning with C# 9.0, you can add the static modifier to a lambda expression or anonymous method. 静的ラムダまたは匿名メソッドでは、ローカル変数またはインスタンスの状態をキャプチャすることはできません。A static lambda or anonymous method can't capture local variables or instance state.

例 - 静的クラスExample - static class

次のクラスは static として宣言され、static メソッドのみが含まれます。The following class is declared as static and contains only static methods:

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

定数宣言や型宣言は暗黙的な static メンバーです。A constant or type declaration is implicitly a static member. static メンバーはインスタンスを使って参照できません。A static member can't be referenced through an instance. 代わりに、型の名前を使って参照します。Instead, it's referenced through the type name. たとえば、次のクラスを考えてみます。For example, consider the following class:

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

static メンバー x を参照するには、同じスコープからその静的メンバーにアクセス可能でない限り、完全修飾名 (MyBaseC.MyStruct.x) を使用します。To refer to the static member x, use the fully qualified name, MyBaseC.MyStruct.x, unless the member is accessible from the same scope:

Console.WriteLine(MyBaseC.MyStruct.x);

クラスのインスタンスには、そのクラスのインスタンス フィールドすべてにそれぞれのコピーが含まれていますが、各 static フィールドのコピーは 1 つだけです。While an instance of a class contains a separate copy of all instance fields of the class, there's only one copy of each static field.

static メソッドまたはプロパティ アクセサーへの参照には、this は使用できません。It isn't possible to use this to reference static methods or property accessors.

static キーワードをクラスに適用する場合、そのクラスのすべてのメンバーが static でなければなりません。If the static keyword is applied to a class, all the members of the class must be static.

クラス、インターフェイス、static クラスには、static コンストラクターを含めることができます。Classes, interfaces, and static classes may have static constructors. static コンストラクターは、プログラムが開始されてからクラスがインスタンス化されるまでの間に呼び出されます。A static constructor is called at some point between when the program starts and the class is instantiated.

注意

static キーワードの用法は、C++ の場合よりも制限されています。The static keyword has more limited uses than in C++. C++ キーワードと比較するには、「ストレージ クラス (C++)」をご覧ください。To compare with the C++ keyword, see Storage classes (C++).

static メンバーの例を示すために、ある企業の従業員を表すクラスを考えてみます。To demonstrate static members, consider a class that represents a company employee. このクラスには、従業員数を数えるメソッドと、従業員数を格納するフィールドがあります。Assume that the class contains a method to count employees and a field to store the number of employees. メソッドとフィールドはどちらも、従業員のインスタンスに属しておらず、Both the method and the field don't belong to any one employee instance. 全体として従業員のクラスに属しています。Instead, they belong to the class of employees as a whole. クラスの static メンバーとして宣言する必要があります。They should be declared as static members of the class.

例 - 静的フィールドとメソッドExample - static field and method

この例では、新しい従業員の名前と ID を読み取り、従業員数のカウンターを 1 つインクリメントして、新しい従業員の情報と従業員数を表示します。This example reads the name and ID of a new employee, increments the employee counter by one, and displays the information for the new employee and the new number of employees. このプログラムでは、現在の従業員数がキーボードから読み取られます。This program reads the current number of employees from the keyboard.

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: {e.name}");
        Console.WriteLine($"ID:   {e.id}");
        Console.WriteLine($"New Number of Employees: {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
*/

例 - 静的な初期化Example - static initialization

この例では、まだ宣言されていない別の static フィールドを使用することで static フィールドを初期化できます。This example shows that you can initialize a static field by using another static field that is not yet declared. static フィールドに値を明示的に割り当てるまで、結果は未定義になります。The results will be undefined until you explicitly assign a value to the static field.

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# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also