コンストラクター (C# プログラミング ガイド)

クラスまたは構造体のインスタンスを作成するたびに、コンストラクターが呼び出されます。 クラスまたは構造体には、異なる引数を取るコンストラクターが複数含まれていることがあります。 プログラマーはコンストラクターを利用することで、既定値を設定したり、インスタンス化を制限したり、柔軟で読みやすいコードを記述したりできます。 詳細と例については、「インスタンス コンストラクター」と「コンストラクターの使用」を参照してください。

新しいインスタンスの初期化の一部であるアクションがいくつかあります。 これらのアクションは、次の順序で実行されます。

  1. インスタンス フィールドは 0 に設定されます。 これは通常、ランタイムによって行われます。
  2. フィールド初期化子が実行されます。 最多派生型のフィールド初期化子が実行されます。
  3. 基本データ型のフィールド初期化子が実行されます。 フィールド初期化子は、各基本データ型から System.Object まで、直接の基底から始まります。
  4. 基本インスタンス コンストラクターが実行されます。 すべてのインスタンス コンストラクターは、各基底クラスから直接の基底クラスまで、Object.Object から始まります。
  5. インスタンス コンストラクターが実行されます。 このインスタンス コンストラクターはその型の実行に使用されます。
  6. オブジェクト初期化子が実行されます。 式にオブジェクト初期化子が含まれている場合は、インスタンス コンストラクターの実行後に実行されます。 オブジェクト初期化子は、テキスト順に実行されます。

上記のアクションは、新しいインスタンスが初期化されるときに実行されます。 struct の新しいインスタンスがその default 値に設定されている場合、すべてのインスタンス フィールドは 0 に設定されます。

静的コンストラクターが実行されていない場合、静的コンストラクターは、いずれかのインスタンス コンストラクター アクションが実行される前に実行されます。

コンストラクターの構文

コンストラクターは、名前がその型の名前と同じメソッドです。 メソッド シグネチャには、アクセス修飾子、メソッド名、およびそのパラメーター リストのみが含まれます。戻り値の型は含まれません。 次の例は、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;
   }
}

静的コンストラクター

前の例には、表示されるすべてのインスタンス コンストラクターがあり、それが新しいオブジェクトを作成します。 クラスまたは構造体には静的コンストラクターを与えることもできます。静的コンストラクターは型の静的メンバーを初期化します。 静的コンストラクターにはパラメーターがありません。 静的コンストラクターを指定して静的フィールドを初期化しない場合、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.
}

詳細と例については、「静的コンストラクター」を参照してください。

このセクションの内容

関連項目