コンストラクターの使用 (C# プログラミング ガイド)
クラス または 構造体 がインスタンス化されると、そのコンストラクターが呼び出されます。 コンストラクターはクラスまたは構造体と同じ名前を持ち、通常は新しいオブジェクトのデータ メンバーを初期化します。
次の例では、Taxi
という名前のクラスを単純なコンストラクターを使用して定義します。 このクラスは、新しい 演算子 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# 12 では、
クラスが静的
次のように、コンストラクターをプライベートにすることで、クラスがインスタンス化されないようにすることができます。
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
詳細については、「プライベートコンストラクター」を参照してください。
構造体 型のコンストラクターは、クラス コンストラクターに似ています。 new
を使用して構造体型がインスタンス化されると、コンストラクターが呼び出されます。 struct
がその default
値に設定されると、ランタイムは構造体内のすべてのメモリを 0 に初期化します。 struct
型でフィールド初期化子を宣言する場合は、パラメーターなしのコンストラクターを指定する必要があります。 詳細については、「構造体型」の記事の構造体の初期化と既定値に関するセクションを参照してください。
次のコードでは、整数が初期化されていることを確認できるように、Int32にパラメーターなしのコンストラクターを使用します。
int i = new int();
Console.WriteLine(i);
ただし、次のコードでは、new
を使用せず、初期化されていないオブジェクトを使用しようとするため、コンパイラ エラーが発生します。
int i;
Console.WriteLine(i);
または、structs
(すべての組み込みの数値型を含む) に基づくオブジェクトを初期化または割り当て、次の例のように使用できます。
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
クラスと構造体の両方で、パラメーターを受け取るコンストラクターを定義できます。これには、プライマリ コンストラクター new
ステートメントまたは 基本 ステートメントを介して呼び出す必要があります。 クラスと構造体は複数のコンストラクターを定義することもできます。パラメーターなしのコンストラクターを定義する必要はありません。 例えば:
public class Employee
{
public int Salary;
public Employee() { }
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
キーワードを使用して明示的に呼び出されない場合、パラメーターなしのコンストラクター (存在する場合) は暗黙的に呼び出されます。 次のコンストラクター宣言は実質的に同じです。
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
基底クラスがパラメーターなしのコンストラクターを提供しない場合、派生クラスは、base
を使用して基底コンストラクターを明示的に呼び出す必要があります。
コンストラクターは、この キーワード 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、protected internal または private protected としてマークできます。 これらのアクセス修飾子は、クラスのユーザーがクラスを構築する方法を定義します。 詳細については、「アクセス修飾子」を参照してください。
コンストラクターは、static キーワードを使用して静的として宣言できます。 静的コンストラクターは、静的フィールドにアクセスする直前に自動的に呼び出され、静的クラス メンバーの初期化に使用されます。 詳細については、「静的コンストラクターの」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」のインスタンス コンストラクターと静的コンストラクターに関するセクションを参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
関連項目
.NET