.NET Visual C#言語入門 > 静的クラスと静的メンバ
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
静的クラスと静的メンバ
静的クラスと静的クラス メンバは、クラスのインスタンスを作成せずにアクセスできるデータや関数を作成する際に使用します。
静的クラス メンバを使用すると、オブジェクトIDに依存しないデータと動作を分離できます。分離されたデータと関数は、オブジェクトにどのような処理が行われたかにかかわらず変更されません。静的クラスは、オブジェクトIDに依存するデータや動作がクラスに存在しないときに使用できます。
静的クラス
特定のオブジェクトに関連付けられていないメソッドを含めるには、静的クラスを使用します。たとえば、インスタンス データで機能せず、コード内の特定のオブジェクトに関連付けられていないメソッドのセットを作成することがよく必要になります。静的クラスは、このようなメソッドを保持するために使用できます。
静的クラスの主要な特徴は次のとおりです。
- 静的メンバのみを含みます。
- インスタンス化できません。
- シールされます。
- インスタンス・コンストラクタを含むことができません。
そのため、静的クラスを作成することと、静的メンバとプライベート・コンストラクタのみを含むクラスを作成することはほぼ同じです。プライベート・コンストラクタは、クラスのインスタンス化を防止します。
静的クラスを使用する利点は、インスタンス メンバが誤って追加されないことをコンパイラで確認できるという点です。コンパイラによって、このクラスのインスタンスを作成できないことが保証されます。
静的クラスはシールされるため、継承できません。静的クラスはコンストラクタを含むことができませんが、静的コンストラクタを宣言して初期値を割り当てたり、静的状態を設定したりすることはできます。詳細については、「静的コンストラクタ」を参照してください。
静的コンストラクタ
静的コンストラクタは、静的データを初期化したり、1 回限りの特定の処理を実行したりする際に使用されます。静的コンストラクタは、最初のインスタンスを作成する前、または静的メンバが参照される前に自動的に呼び出されます。
class SimpleClass { static SimpleClass() { //... } }
静的コンストラクタには、次のような特徴があります。
- 静的コンストラクタはアクセス修飾子をとらず、パラメータはありません。
- 最初のインスタンスが作成される前、または静的メンバが参照される前に、静的コンストラクタが自動的に呼び出されてクラスを初期化します。
- 静的コンストラクタを直接呼び出すことはできません。
- プログラム内で静的コンストラクタが実行されるタイミングを制御することはできません。
- 静的コンストラクタは、通常、クラスがログ ファイルを使用しているときに使われ、このファイルにエントリを書き込みます。
- 静的コンストラクタは、アンマネージ コードのラッパー クラスを作成するときにも役立ちます。その際、静的コンストラクタは、LoadLibrary メソッドを呼び出すことができます。
使用例
次の例の Bus クラスには、静的コンストラクタと 1 つの静的メンバ Drive() があります。Drive() が呼び出されると、静的コンストラクタが呼び出されてクラスを初期化します。
public class Bus { static Bus() { System.Console.WriteLine("The static constructor invoked."); } public static void Drive() { System.Console.WriteLine("The Drive method invoked."); } } class TestBus { static void Main() { Bus.Drive(); } }
出力
The static constructor invoked. The Drive method invoked.
静的クラスを使用する場合
たとえば、会社名と住所に関する情報を取得する次のメソッドが CompanyInfo クラスに含まれているとします。
class CompanyInfo { public string GetCompanyName() { return "CompanyName"; } public string GetCompanyAddress() { return "CompanyAddress"; } //... }
これらのメソッドは、このクラスの特定のインスタンスに割り当てる必要がありません。そのため、不必要なインスタンスを作成する代わりに、このクラスを次のように静的クラスとして宣言できます。
static class CompanyInfo { public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddress"; } //... }
静的クラスは、特定のオブジェクトに関連付けられていないメソッドの編成単位として使用します。また、静的クラスを使用すると、メソッドを呼び出すためにオブジェクトを作成する必要がないので、実装を簡素化し、迅速化できます。これは、System 名前空間に Math クラスのメソッドを編成するなど、クラス内にメソッドを適切に編成するためにも役立ちます。
静的メンバ
静的クラス メンバは、次のようにメンバの戻り値の型の前に static キーワードを配置して宣言します。
public class Automobile { public static int NumberOfWheels = 4; public static int SizeOfGasTank { get { return 15; } } public static void Drive() { } public static event EventType RunOutOfGas; }
静的メンバは初めてアクセスされる前に初期化されます。また、静的コンストラクタが呼び出された場合は、静的コンストラクタが実行される前に初期化されます。静的クラス メンバにアクセスするには、変数名の代わりにクラスの名前を使用して、そのメンバの位置を指定します。以下にサンプルを示します。
Automobile.Drive();
int i = Automobile.NumberOfWheels;
使用例
次に、摂氏と華氏の間で温度を変換する 2 つのメソッドを含む静的クラスのコード例を示します。
public static class TemperatureConverter { public static double CelsiusToFahrenheit(string temperatureCelsius) { double celsius = System.Double.Parse(temperatureCelsius); double fahrenheit = (celsius * 9 / 5) + 32; return fahrenheit; } public static double FahrenheitToCelsius(string temperatureFahrenheit) { double fahrenheit = System.Double.Parse(temperatureFahrenheit); double celsius = (fahrenheit - 32) * 5 / 9; return celsius; } } class TestTemperatureConverter { static void Main() { System.Console.WriteLine("Please select the convertor direction"); System.Console.WriteLine("1. From Celsius to Fahrenheit."); System.Console.WriteLine("2. From Fahrenheit to Celsius."); System.Console.Write(":"); string selection = System.Console.ReadLine(); double F, C = 0; switch (selection) { case "1": System.Console.Write("Please enter the Celsius temperature: "); F = TemperatureConverter.CelsiusToFahrenheit(System.Console.ReadLine()); System.Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F); break; case "2": System.Console.Write("Please enter the Fahrenheit temperature: "); C = TemperatureConverter.FahrenheitToCelsius(System.Console.ReadLine()); System.Console.WriteLine("Temperature in Celsius: {0:F2}", C); break; default: System.Console.WriteLine("Please select a convertor."); break; } } }
入力
2 98.6
出力例
Please select the convertor 1. From Celsius to Fahrenheit. 2. From Fahrenheit to Celsius. :2 Please enter the Fahrenheit temperature: 98.6 Temperature in Celsius: 37.00
他の出力例は次のようになります。
Please select the convertor 1. From Celsius to Fahrenheit. 2. From Fahrenheit to Celsius. :1 Please enter the Celsius temperature: 37.00 Temperature in Fahrenheit: 98.60
静的クラスと静的メンバ
静的クラスと静的クラス メンバは、クラスのインスタンスを作成せずにアクセスできるデータや関数を作成する際に使用します。
静的クラス メンバを使用すると、オブジェクトIDに依存しないデータと動作を分離できます。分離されたデータと関数は、オブジェクトにどのような処理が行われたかにかかわらず変更されません。静的クラスは、オブジェクトIDに依存するデータや動作がクラスに存在しないときに使用できます。
静的クラス
特定のオブジェクトに関連付けられていないメソッドを含めるには、静的クラスを使用します。たとえば、インスタンス データで機能せず、コード内の特定のオブジェクトに関連付けられていないメソッドのセットを作成することがよく必要になります。静的クラスは、このようなメソッドを保持するために使用できます。
静的クラスの主要な特徴は次のとおりです。
- 静的メンバのみを含みます。
- インスタンス化できません。
- シールされます。
- インスタンス・コンストラクタを含むことができません。
そのため、静的クラスを作成することと、静的メンバとプライベート・コンストラクタのみを含むクラスを作成することはほぼ同じです。プライベート・コンストラクタは、クラスのインスタンス化を防止します。
静的クラスを使用する利点は、インスタンス メンバが誤って追加されないことをコンパイラで確認できるという点です。コンパイラによって、このクラスのインスタンスを作成できないことが保証されます。
静的クラスはシールされるため、継承できません。静的クラスはコンストラクタを含むことができませんが、静的コンストラクタを宣言して初期値を割り当てたり、静的状態を設定したりすることはできます。詳細については、「静的コンストラクタ」を参照してください。
静的コンストラクタ
静的コンストラクタは、静的データを初期化したり、1 回限りの特定の処理を実行したりする際に使用されます。静的コンストラクタは、最初のインスタンスを作成する前、または静的メンバが参照される前に自動的に呼び出されます。
class SimpleClass { // Static constructor static SimpleClass() { //... } }
静的コンストラクタには、次のような特徴があります。
- 静的コンストラクタはアクセス修飾子をとらず、パラメータはありません。
- 最初のインスタンスが作成される前、または静的メンバが参照される前に、静的コンストラクタが自動的に呼び出されてクラスを初期化します。
- 静的コンストラクタを直接呼び出すことはできません。
- プログラム内で静的コンストラクタが実行されるタイミングを制御することはできません。
- 静的コンストラクタは、通常、クラスがログ ファイルを使用しているときに使われ、このファイルにエントリを書き込みます。
- 静的コンストラクタは、アンマネージ コードのラッパー クラスを作成するときにも役立ちます。その際、静的コンストラクタは、LoadLibrary メソッドを呼び出すことができます。
使用例
次の例の Bus クラスには、静的コンストラクタと 1 つの静的メンバ Drive() があります。Drive() が呼び出されると、静的コンストラクタが呼び出されてクラスを初期化します。
public class Bus { static Bus() { System.Console.WriteLine("The static constructor invoked."); } public static void Drive() { System.Console.WriteLine("The Drive method invoked."); } } class TestBus { static void Main() { Bus.Drive(); } }
出力
The Drive method invoked.
静的クラスを使用する場合
たとえば、会社名と住所に関する情報を取得する次のメソッドが CompanyInfo クラスに含まれているとします。
class CompanyInfo { public string GetCompanyName() { return "CompanyName"; } public string GetCompanyAddress() { return "CompanyAddress"; } //... }
これらのメソッドは、このクラスの特定のインスタンスに割り当てる必要がありません。そのため、不必要なインスタンスを作成する代わりに、このクラスを次のように静的クラスとして宣言できます。
static class CompanyInfo { public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddress"; } //... }
静的クラスは、特定のオブジェクトに関連付けられていないメソッドの編成単位として使用します。また、静的クラスを使用すると、メソッドを呼び出すためにオブジェクトを作成する必要がないので、実装を簡素化し、迅速化できます。これは、System 名前空間に Math クラスのメソッドを編成するなど、クラス内にメソッドを適切に編成するためにも役立ちます。
静的メンバ
静的クラス メンバは、次のようにメンバの戻り値の型の前に static キーワードを配置して宣言します。
public class Automobile { public static int NumberOfWheels = 4; public static int SizeOfGasTank { get { return 15; } } public static void Drive() { } public static event EventType RunOutOfGas; }
静的メンバは初めてアクセスされる前に初期化されます。また、静的コンストラクタが呼び出された場合は、静的コンストラクタが実行される前に初期化されます。静的クラス メンバにアクセスするには、変数名の代わりにクラスの名前を使用して、そのメンバの位置を指定します。以下にサンプルを示します。
Automobile.Drive();
int i = Automobile.NumberOfWheels;
使用例
次に、摂氏と華氏の間で温度を変換する 2 つのメソッドを含む静的クラスのコード例を示します。
public static class TemperatureConverter { public static double CelsiusToFahrenheit(string temperatureCelsius) { double celsius = System.Double.Parse(temperatureCelsius); double fahrenheit = (celsius * 9 / 5) + 32; return fahrenheit; } public static double FahrenheitToCelsius(string temperatureFahrenheit) { double fahrenheit = System.Double.Parse(temperatureFahrenheit); double celsius = (fahrenheit - 32) * 5 / 9; return celsius; } } class TestTemperatureConverter { static void Main() { System.Console.WriteLine("Please select the convertor direction"); System.Console.WriteLine("1. From Celsius to Fahrenheit."); System.Console.WriteLine("2. From Fahrenheit to Celsius."); System.Console.Write(":"); string selection = System.Console.ReadLine(); double F, C = 0; switch (selection) { case "1": System.Console.Write("Please enter the Celsius temperature: "); F = TemperatureConverter.CelsiusToFahrenheit(System.Console.ReadLine()); System.Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F); break; case "2": System.Console.Write("Please enter the Fahrenheit temperature: "); C = TemperatureConverter.FahrenheitToCelsius(System.Console.ReadLine()); System.Console.WriteLine("Temperature in Celsius: {0:F2}", C); break; default: System.Console.WriteLine("Please select a convertor."); break; } } }
入力
98.6
出力例
Please select the convertor
1. From Celsius to Fahrenheit.
2. From Fahrenheit to Celsius.
:2
Please enter the Fahrenheit temperature: 98.6
Temperature in Celsius: 37.00
他の出力例は次のようになります。
Please select the convertor
1. From Celsius to Fahrenheit.
2. From Fahrenheit to Celsius.
:1
Please enter the Celsius temperature: 37.00
Temperature in Fahrenheit: 98.60