コンストラクター (C# プログラミング ガイド)
新しいインスタンスの初期化の一部であるアクションがいくつかあります。 次のアクションは、次の順序で実行されます。
- インスタンス フィールドは 0に設定されます。 通常、この初期化はランタイムによって行われます。
- フィールド初期化子が実行されます。 最多派生型のフィールド初期化子が実行されます。
- 基本型フィールド初期化子は、実行されます。 フィールド初期化子は、直接の基底クラスから始まり、各基底クラスを通って System.Objectまで続きます。
- 基本インスタンス コンストラクターが実行されます。 各基底クラスから直接基底クラスへの Object.Object から始まる任意のインスタンス コンストラクター。
- インスタンス コンストラクターが実行されます。 型のインスタンス コンストラクターが実行されます。
- オブジェクト初期化子が実行されます。 式にオブジェクト初期化子が含まれている場合は、インスタンス コンストラクターの実行後に実行されます。 オブジェクト初期化子は、テキスト順に実行されます。
上記のアクションは、new
演算子を使用してインスタンスが作成されるときに実行されます。 struct
の新しいインスタンスがその default
値に設定されている場合、すべてのインスタンス フィールドは 0 に設定されます。 配列の要素は、配列の作成時に既定値の 0 または null
に設定されます。
静的コンストラクター(存在する場合) は、型の任意のインスタンスに対してインスタンス コンストラクターアクションが実行される前に実行されます。 静的コンストラクターは、最大で 1 回実行されます。
コンストラクターの構文
コンストラクターは、型と同じ名前のメソッドです。 そのメソッド シグネチャには、オプションの アクセス修飾子、メソッド名、およびパラメーター リストを含めることができます。戻り値の型は含まれません。 次の例は、Person
という名前のクラスのコンストラクターを示しています。
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
コンストラクターを 1 つのステートメントとして実装できる場合は、式本体メンバー使用できます。 次の例では、コンストラクターに name という名前の文字列パラメーターが 1 つある Location
クラスが定義されています。 式本体の定義は、引数を locationName
フィールドに割り当てます。
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
型でインスタンスを作成するためにパラメーターが必要な場合は、次の例に示すように、プライマリ コンストラクター を使用して、型のインスタンス化に 1 つ以上のパラメーターが必要であることを示すことができます。
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents
{
get;
init;
}
}
静的コンストラクター
前の例では、新しいオブジェクトを初期化するインスタンス コンストラクターを示します。 クラスまたは構造体は、型の静的メンバーを初期化する静的コンストラクターを宣言することもできます。 静的コンストラクターはパラメーターなしです。 静的コンストラクターを指定して静的フィールドを初期化しない場合、C# コンパイラは、「C# 型の既定値」の記事にある既定値に静的フィールドを初期化します。
次の例では、静的コンストラクターを使用して静的フィールドを初期化します。
public class Adult : Person
{
private static int minimumAge;
public Adult(string lastName, string firstName) : base(lastName, firstName)
{ }
static Adult() => minimumAge = 18;
// Remaining implementation of Adult class.
}
次の例に示すように、式本体の定義を使用して静的コンストラクターを定義することもできます。
public class Child : Person
{
private static int maximumAge;
public Child(string lastName, string firstName) : base(lastName, firstName)
{ }
static Child() => maximumAge = 18;
// Remaining implementation of Child class.
}
詳細と例については、「静的コンストラクターの」を参照してください。
関連項目
.NET