コンストラクターの使用 (C# プログラミング ガイド)
クラス または 構造体 がインスタンス化されると、ランタイムはそのコンストラクターを呼び出します。 コンストラクターの名前はクラスまたは構造体と同じで、通常は、このコンストラクターによって、新しいオブジェクトのデータ メンバーが初期化されます。
次の例では、Taxi
というクラスが、簡単なコンストラクターを使用して定義された後、 その後、このクラスは new
演算子を使用してインスタンス化されます。 ランタイムは、新しいオブジェクトにメモリが割り当てられた直後に、Taxi
コンストラクターを呼び出します。
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
パラメーターを取らないコンストラクターを "パラメーターなしのコンストラクター" と呼びます。 ランタイムは、new
演算子を使用してオブジェクトがインスタンス化され、new
に引数が指定されていない場合に、パラメーターなしのコンストラクターを呼び出します。 C# 12 では、
クラスが静的である場合を除き、コンストラクターが存在しないクラスには、クラスをインスタンス化できるように、パブリックなパラメーターなしのコンストラクターが C# コンパイラによって割り当てられます。 詳細については、「静的クラスと静的クラス メンバー」を参照してください。
次のようにコンストラクターをプライベートにすれば、クラスがインスタンス化されないようにできます。
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
詳細については、「プライベートコンストラクター」を参照してください。
struct 型のコンストラクターは、クラス コンストラクターに似ています。 new
を使用して構造体型がインスタンス化されると、ランタイムはコンストラクターを呼び出します。 struct
が default
の値に設定されている場合、実行時間は、すべてのメモリを 0 に初期化します。 struct
型でフィールド初期化子を宣言する場合は、パラメーターなしのコンストラクターを指定する必要があります。 詳細については、「構造体型」の記事の構造体の初期化と既定値に関するセクションを参照してください。
次のコードでは、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);
classes と structs の両方で、パラメーターを考慮するコンストラクターを定義できます。これには、プライマリ コンストラクターが含まれます。 パラメーターを受け取るコンストラクターは、new
ステートメントまたは base ステートメントを使用して呼び出す必要があります。 classes と structs は、複数のコンストラクターを定義でき、どちらも、パラメーターなしのコンストラクターの定義には必要ありません。 次に例を示します。
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
を使って基本コンストラクターを明示的に呼び出す必要があります。
コンストラクターは、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
、内部、保護された内部 、または private protected
としてマークできます。 こうしたアクセス修飾子により、クラスのユーザーによるクラスの作成方法が定義されます。 詳細については、「アクセス修飾子」を参照してください。
コンストラクターは、static
キーワードを使用して静的として宣言できます。 静的コンストラクターは、静的フィールドにアクセスする前に自動的に呼び出され、静的クラス メンバーの初期化に使用されます。 詳細については、「静的コンストラクター」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」のインスタンス コンストラクターと静的コンストラクターに関するセクションを参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
.NET