C#初心者のための基礎!コンストラクタの意味と使い方をわかりやすく解説#17

当サイトではアフィリエイト広告を利用しています。

C#初級プログラミング

コンストラクタとは?

コンストラクタとは、クラスを生成するときに呼び出す特殊なメソッドです。クラスを生成するときに呼び出されるため、クラスのインスタンスを生成すると同時にクラスの初期値を設定できます。クラスが生成されるときに、最初にどういった値を設定しておくかを明確にすることで、プログラムの可読性が上がるという効果もあります。

例えば顧客クラスを生成するときにIDと名前を指定するようにコンストラクタが定義されている場合は、顧客クラスは生成後は必ずIDと名前が設定されているという事が保証されることになります。これを完全コンストラクタパターンといいます。

コンストラクタの数

コンストラクタは一つのクラスに複数定義することができます。ただし、同じ引数の構成のものは重複して定義することはできません。これはメソッドを作成するときの成約と同じです。

コンストラクタの書き方

アクセス修飾子、クラス名、(引数)
コンストラクタは特殊なメソッドなので、戻り値はなく、名前も必ずクラス名を記述する必要があります。

public Customer(string firstName,string lastName)
{
    FirstName = firstName;
    LastName = lastName;
}

コンストラクタイニシャライザ

コンストラクタイニシャライザとは、あるコンストラクタから、別のコンストラクタを呼び出せる機能の事を言います。例えば顧客クラスに「IDと名前」を指定させるコンストラクタと「ID」のみを指定するコンストラクタが定義されている場合、「ID」のみを指定するコンストラクタから「IDと名前」を指定するコンストラクタを呼びだすことができます。この機能により「ID」のみを指定するコンストラクタが呼ばれた場合は「引数のID」と「名前のデフォルト値」を用いて、「IDと名前」のコンストラクタを呼び出すことで、「ID」のみのコンストラクタには処理を書く必要がなくなり、重複コードがなくなるという効果があります。

コンストラクタイニシャライザの書き方

アクセス修飾子、クラス名、(引数)、コロン、this(引数)

通常のコンストラクタの書き方に加えて、コロンでつないでthisキーワードを書きます。thisとは自分自身の意味なので、自分のクラスの別のコンストラクタを呼び出すという意味になります。thisの後の引数には、別の呼び出したいコンストラクタの引数を指定します。通常は最初に呼び出されているコンストラクタで不足している引数にデフォルト値を設定し、それ以外は引数をそのまま引き渡すという使い方をします。

public Customer( string lastName) :this("--",lastName)
{
    //コンストラクタイニシャライザによりここに重複コードを書く必要がなくなる
    ////FirstName = "--";
    ////LastName = lastName;
}

サンプルコード

namespace CS17
{
    class Customer
    {
        public string FirstName;
        public string LastName;

        ///
        /// コンストラクタ(フルネーム指定)
        /// 
        ///名
        ///姓
        public Customer(string firstName,string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }

        ///
        /// コンストラクタ(苗字指定)
        /// 
        ///姓
        public Customer( string lastName) :this("--",lastName)
        {
            //コンストラクタイニシャライザによりここに重複コードを書く必要がなくなる
            ////FirstName = "--";
            ////LastName = lastName;
        }

        ///
        /// フルネームの取得
        /// 
        /// 
        public string GetFullName()
        {
            return LastName + FirstName;
        }
    }
}

フルネーム指定と苗字のみ指定のコンストラクタを2つ作成。苗字のみ指定のコンストラクタが呼ばれたときは、コンストラクタイニシャライザ機能を使い、名前を「–」で指定して、フルネーム指定のコンストラクタを呼び出すことで、重複コードをなくしています。