コンストラクタの使用 (C# プログラミング ガイド)
更新 : 2007 年 11 月
コンストラクタは、特定の型のオブジェクトを作成するときに実行されるクラス メソッドです。コンストラクタはクラスと同じ名前を持ち、通常、新しいオブジェクトのデータ メンバを初期化します。
次の例では、Taxi というクラスを簡単なコンストラクタを使用して定義しています。このクラスは、次に new 演算子によってインスタンス化されます。新しいオブジェクトにメモリが割り当てられるとすぐに、Taxi コンストラクタが new 演算子によって呼び出されます。
public class Taxi
{
public bool isInitialized;
public Taxi()
{
isInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
Console.WriteLine(t.isInitialized);
}
}
パラメータを受け取らないコンストラクタを既定のコンストラクタと呼びます。既定のコンストラクタは、new 演算子を使用してオブジェクトをインスタンス化する際に new に引数が渡されない場合に呼び出されます。詳細については、「インスタンス コンストラクタ (C# プログラミング ガイド)」を参照してください。
クラスが静的である場合を除き、コンストラクタが存在しないクラスには、C# コンパイラによりパブリックな既定のコンストラクタが割り当てられ、クラスをインスタンス化できるようになります。詳細については、「静的クラスと静的クラス メンバ (C# プログラミング ガイド)」を参照してください。
次のようにコンストラクタをプライベートにすると、クラスがインスタンス化されないようにできます。
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
詳細については、「プライベート コンストラクタ (C# プログラミング ガイド)」を参照してください。
struct 型のコンストラクタはクラス コンストラクタに似ていますが、struct には、既定のコンストラクタがコンパイラによって自動的に提供されるため、明示的な既定のコンストラクタを含めることができません。このコンストラクタは、struct 内の各フィールドを既定値に初期化します。詳細については、「既定値の一覧表 (C# リファレンス)」を参照してください。ただし、この既定のコンストラクタは、struct が new によってインスタンス化される場合にのみ呼び出されます。たとえば、次のコードでは、Int32 の既定のコンストラクタが使用されるため、確実に整数を初期化できます。
int i = new int();
Console.WriteLine(i);
しかし、次のコードでは、new を使用せず、初期化されていないオブジェクトを使用するため、コンパイラ エラー CS0165 になります。
int i;
Console.WriteLine(i);
これに対して、struct に基づくオブジェクト (組み込みのすべての数値型を含む) は、次の例のように、初期化または代入してから使用することができます。
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
そのため、値型の既定のコンストラクタを呼び出す必要がありません。
クラスも struct も共に、パラメータを受け取るコンストラクタを定義できます。パラメータを受け取るコンストラクタは、new ステートメントまたは base ステートメントを使用して呼び出す必要があります。クラスと structs では複数のコンストラクタも定義でき、クラスと構造体のどちらも既定のコンストラクタを定義する必要はありません。次に例を示します。
public class Employee
{
public int salary;
public Employee(int annualSalary)
{
salary = annualSalary;
}
public Employee(int weeklySalary, int numberOfWeeks)
{
salary = weeklySalary * numberOfWeeks;
}
}
このクラスは、次のいずれかのステートメントを使用して作成できます。
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
コンストラクタでは、base キーワードを使用して、基本クラスのコンストラクタを呼び出すことができます。次に例を示します。
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
この例では、コンストラクタのブロックを実行する前に基本クラスのコンストラクタを呼び出しています。base キーワードは、パラメータの有無に関係なく使用することもできます。コンストラクタのパラメータは、base のパラメータまたは、式の一部として使用できます。詳細については、「base (C# リファレンス)」を参照してください。
派生クラスでは、base キーワードを使用して基本クラスのコンストラクタを明示的に呼び出さないと、既定のコンストラクタ (存在する場合) が暗黙的に呼び出されます。そのため、次に示すコンストラクタの宣言も実質的に同じです。
public Manager(int initialdata)
{
//Add further instructions here.
}
public Manager(int initialdata)
: base()
{
//Add further instructions here.
}
基本クラスが既定のコンストラクタを提供しない場合、派生クラスでは、base を使って基本コンストラクタを明示的に呼び出す必要があります。
コンストラクタで this キーワードを使用すると、同じオブジェクトの別のコンストラクタを呼び出すことができます。base と同様に、this もパラメータの有無に関係なく使用でき、コンストラクタのパラメータはいずれも this のパラメータとしても、式の一部としても使用できます。たとえば、上の例の 2 番目のコンストラクタは、this を使用して次のように書き直すことができます。
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
上の例で this キーワードを使用すると、このコンストラクタが呼び出されます。
public Employee(int annualSalary)
{
salary = annualSalary;
}
コンストラクタは、public、private、protected、internal、または protectedinternal とマークできます。これらのアクセス修飾子により、クラスのユーザーがクラスを作成する方法が定義されます。詳細については、「アクセス修飾子 (C# プログラミング ガイド)」を参照してください。
コンストラクタは、static キーワードを使用して静的と宣言できます。静的コンストラクタは、静的フィールドがアクセスされる直前に自動的に呼び出され、一般に静的なクラス メンバを初期化するために使用されます。詳細については、「静的コンストラクタ (C# プログラミング ガイド)」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
1.6.7.1 コンストラクタ
10.11 インスタンス コンストラクタ (クラス)
11.3.8 コンストラクタ (構造体)
11.3.10 静的コンストラクタ (構造体)