前回は「インスタンス(設計図から作る実物)」をやりました。

今回は、インスタンスを作るときに、初期設定をまとめてやる仕組み。コンストラクタです。

コンストラクタとは、インスタンスを作る瞬間に、自動で実行される特別な処理です。

作った後の設定が、面倒だった

前回まで、インスタンスを作った後に、データを1つずつ設定していました。

Person taro = new Person();
taro.Name = "山田";
taro.Age = 20;

new してから、名前を入れて、年齢を入れて…。3人作るなら、これを3回。少し面倒です。

それに、設定し忘れる危険もあります。

Person taro = new Person();
taro.Name = "山田";
// 年齢を設定し忘れた! → taro.Age は 0 のまま

「作るときに、必要な情報をまとめて渡せたら」便利ですよね。それを実現するのが、コンストラクタです。

書き方を見てみる

Person に、コンストラクタを追加します。

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)   // コンストラクタ
    {
        Name = name;
        Age = age;
    }
}

public Person(...) の部分がコンストラクタです。少し変わった見た目ですが、特徴があります。

  • 名前が、クラス名とまったく同じPerson
  • 戻り値の型がないvoidint も書かない)

この2つが、コンストラクタの目印です。中身は、渡された情報(引数)を、自分のデータに設定しているだけ。第16回でやった引数が、ここで活きています。

使ってみる

コンストラクタを作ると、new するときに情報を渡せるようになります。

Person taro = new Person("山田", 20);

Console.WriteLine(taro.Name);   // 山田
Console.WriteLine(taro.Age);    // 20

new Person("山田", 20) と書くだけで、作ると同時に名前と年齢が設定されました。

前のように、後から1つずつ設定する必要がありません。

// 前のやり方
Person taro = new Person();
taro.Name = "山田";
taro.Age = 20;

// コンストラクタを使うと
Person taro = new Person("山田", 20);

3行が1行に。しかも、設定し忘れがなくなります。作るときに必ず名前と年齢を渡すルールなので、「年齢が未設定」が起きません。

コンストラクタは、いつ動くのか

名前のとおり、コンストラクタは「構築する(construct)」処理です。new した、その瞬間に、自動で実行されます。

Person taro = new Person("山田", 20);
//            ↑ ここで、コンストラクタが自動的に動く

自分で taro.Constructor() のように呼ぶ必要はありません。new が、自動で呼んでくれます。「実物が生まれる瞬間の、初期設定」だと考えると分かりやすいです。

実は、ずっと使っていた

ここで、ひとつ種明かしを。これまで書いてきた new Person() の、最後のカッコ ()

Person taro = new Person();

このカッコ、実はコンストラクタを呼んでいたんです。コンストラクタを自分で書かない場合、C#が「何もしない、空のコンストラクタ」を用意してくれていました。だから () で済んでいたのです。

そして第12回の new List<int>() も、同じ。あの () も、List のコンストラクタを呼んでいました。知らないうちに、ずっと使っていたんですね。

つまずきポイント

初心者が戸惑うのが、コンストラクタを書くと、引数なしで new できなくなることです。

class Person
{
    public Person(string name, int age) { ... }  // 引数ありのコンストラクタを書いた
}

Person taro = new Person();           // 引数なし → エラー!
Person taro = new Person("山田", 20); // 引数あり → OK

「名前と年齢を渡してね」というコンストラクタを書いた以上、何も渡さない new Person() はルール違反になります。

もし両方使いたいなら、引数なしのコンストラクタも別に書く、という方法もあります(複数書けます)。今は「コンストラクタを書いたら、そのルールに従って new する」と覚えておけば十分です。

まとめ

コンストラクタは、インスタンスを作る瞬間に動く、初期設定の処理。

class Person
{
    public Person(string name, int age)   // クラス名と同じ、戻り値なし
    {
        Name = name;
        Age = age;
    }
}

Person taro = new Person("山田", 20);   // 作ると同時に設定
  • new した瞬間に、自動で実行される
  • 作るときに必要な情報を、まとめて渡せる
  • 設定し忘れを防げる
  • 名前はクラス名と同じ、戻り値の型は書かない

次回は、いよいよオブジェクト指向の山場、継承 です。クラスを「受けつぐ」という考え方を学びます。