更新 : 2007 年 11 月
プライベート コンストラクタは、特別なインスタンス コンストラクタです。通常は、静的メンバだけを含むクラスで使用されます。クラスに 1 つ以上のプライベート コンストラクタがあり、パブリック コンストラクタがない場合、他のクラス (入れ子になったクラスを除く) はこのクラスのインスタンスを作成できません。次に例を示します。
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
空のコンストラクタを宣言すると、既定コンストラクタの自動生成は行われません。コンストラクタにアクセス修飾子を指定しない場合でも、コンストラクタは既定でプライベートになります。しかし、通常は、private 修飾子を明示的に使って、クラスをインスタンス化できないことを明確に示します。
プライベート コンストラクタは、Math クラスなどのようにインスタンス フィールドやメソッドが存在しない場合や、クラスのインスタンスを取得するためにメソッドが呼び出される場合に、クラスのインスタンスが作成されないようにするために使用します。クラス内のすべてのメソッドが静的な場合は、クラス全体を静的にすることを検討してください。詳細については、「静的クラスと静的クラス メンバ (C# プログラミング ガイド)」を参照してください。
使用例
プライベート コンストラクタを使用するクラスの例を次に示します。
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
class TestCounter
{
static void Main()
{
// If you uncomment the following statement, it will generate
// an error because the constructor is inaccessible:
// Counter aCounter = new Counter(); // Error
Counter.currentCount = 100;
Counter.IncrementCount();
Console.WriteLine("New count: {0}", Counter.currentCount);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: New count: 101
この例で次のステートメントのコメントを解除すると、保護レベルのためにコンストラクタにアクセスできなくなり、エラーが発生します。
// Counter aCounter = new Counter(); // Error
C# 言語仕様
詳細については、「C# 言語仕様」の以下のセクションを参照してください。
10.11.5 プライベート コンストラクタ
10.1.1.3 静的クラス