static (C# リファレンス)
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) を使用します。
Console.WriteLine(MyBaseC.MyStruct.x);
クラスのインスタンスには同クラスのすべてのインスタンス フィールドのコピーが別に含まれますが、各静的フィールドのコピーは 1 つだけです。
静的メソッドまたは静的プロパティ アクセサーへの参照には、this は使用できません。
static キーワードをクラスに適用する場合、そのクラスのすべてのメンバーが静的であることが必要です。
クラスおよび静的クラスには、静的コンストラクターを含めることができます。 静的コンストラクターは、プログラム開始時点からクラスがインスタンス化される時点までの間に呼び出されます。
注意
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# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
参照
参照
静的クラスと静的クラス メンバー (C# プログラミング ガイド)