静的クラス
静的メンバのみのクラス
通常のクラスはインスタンスメンバと静的メンバを組み合わせることができますが、アプリケーション内で常に 1 つしか存在しないグローバルなデータや処理を扱うことが目的のクラスであればインスタンスを生成する必要はなく、すべて静的メンバだけで構成できます。
このような静的メンバしか持たないクラスは、通常のクラスでも作成できます。しかし、静的メンバしか持たないクラスのインスタンスを作成することは無意味であり、プログラムの意味的には誤りだと解釈できます。
class A { public stacic M() {} }
例えば上記の A クラスは静的な M() メソッドしか保持していません。このメソッドはインスタンスがなくても A.M() という形で呼び出せるため、A クラスのインスタンスを生成することに意味はありません。
このような静的メンバしか持たないクラスは静的クラス(static class)として宣言することで、不要なインスタンス化を防ぐことができます。静的クラスを宣言するには、クラス宣言時に static 修飾子を指定します。クラス宣言も、フィールドやメソッドのようなメンバ宣言と同じように class キーワードの前にクラス修飾子(class modifier:)を指定できます。
クラス修飾子 class クラス名
クラス修飾子に設定できるキーワードは、クラスが宣言されている場所によって制約が異なりますが、基本的な考え方はメンバの修飾子と同じです。
静的クラスを宣言するには、クラス修飾子に static キーワードを指定します。
static class クラス名
この static 修飾子は、宣言するクラスが静的クラスであることを表します。静的クラスはインスタンス化できず、変数などを宣言するための方として利用することもできません。
static class A { public static void StaticMethod() { } //OK public void InstanceMethod() { } //エラー } class Sample { static void Main(string[] args) { A obj = new A(); //エラー } }
上のコードの A クラスは static 修飾子で宣言された静的クラスです。静的クラスはインスタンスメンバを持てず、すべてのメンバは静的メンバでなければなりません。また静的クラスをインスタンス化することはできないため、静的クラスの変数を宣言することもできません。
static class BuchDerDunkelheit { public static int PageCount { get; private set; } public static void Sammlung(MagicalGirl magicalGirl) { System.Console.WriteLine("蒐集: " + magicalGirl.Name); int pages = magicalGirl.MagicPower / 100; PageCount += pages; magicalGirl.MagicPower -= pages * 100; System.Console.WriteLine("Geschrieben: " + pages + " pages"); } } public class MagicalGirl { public string Name { get; set; } public int MagicPower { get; set; } } class Sample { static void Main(string[] args) { MagicalGirl nanoha = new MagicalGirl(); nanoha.Name = "高町なのは"; nanoha.MagicPower = 3580; BuchDerDunkelheit.Sammlung(nanoha); } }
コード1の BuchDerDunkelheit クラスは static 修飾子で宣言された静的クラスです。このクラスは static なメンバしか宣言できません。Sammlung() メソッドは MagicalGirl クラスのオブジェクトを受け取り、MagicPower プロパティの値から、自身の静的な PageCount プロパティを加えます。
主に、静的クラスは状態を持たない関連する機能をまとめるために応用されます。代表的な例は数学処理を行うメソッドをまとめた静的クラスでしょう。円周率 π や自然対数の底 e などの数学定数や、指数関数、対数関数、三角関数などの数学処理にインスタンスは必要ないため、このような機能を提供する数学クラスは静的クラスとして設計されるでしょう。実際に .NET Framework の基本クラスライブラリでは静的な System.Math クラスで数学関連処理が提供されています。