コンストラクターの使用 (C# プログラミング ガイド)
クラス か 構造体 が作成されると、コンストラクターが呼び出されます。コンストラクターがクラスまたは構造体と同じ名前を持ち、通常、新しいオブジェクトのデータ メンバーを初期化します。
次の例では、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 を使用せず、初期化されていないオブジェクトを使用するため、コンパイラ エラーになります。
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# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。