なんだかGoodVibes

日々の勉強メモです。

コンストラクタって?

コンストラクタって何なのでしょうか? C# 入門したときに、自分の中に全く消化できないものでした。
勉強を始めて、自分の中に落とし込めた部分をメモしたいと思います。

コンストラクタは
・new したときに呼び出されるメソッド ・クラスと同じ名前
・戻り値はない

コンストラクタはインスタンスを初期化するために存在します。 以下のClassAメソッドがコンストラクタです。

class OriginClass
{
    public void MainOrigin()
    {
        var classA = new ClassA();
    }
}

class ClassA
{
    public ClassA()
    {
        Console.WriteLine("ClassAです。");
    }
}

ClassA をnew すると以下の出力が得られます。

ClassAです。

ClassA のコンストラクタが呼び出されているのがわかりますね。

次のサンプルはどうでしょうか?

class OriginClass
{
    public void MainOrigin()
    {
        var classB = new ClassB();
        classB.MainClassB();
    }
}

class ClassB
{
    public void MainClassB()
    {
        Console.WriteLine("MainClassBです。");
    }
}

今回はコンストラクタが存在していませんね。
ではnewしたときに何を呼び出しているのでしょうか?
C#では、クラスのコンストラクタを明示的に定義しないと
引数のない既定のコンストラクタが使われるのです。
1つでもコンストラクタを設定すると、既定のコンストラクタは生成されません。

次にコンストラクタで初期化をしてみましょう。

class OriginClass
{
    public void MainOrigin()
    {
        var classC = new ClassC(10);
        Console.WriteLine("OriginClassです。");
        Console.WriteLine($"Num = {classC.Num}");
    }
}

class ClassC
{
    public int Num;

    public ClassC(int num)
    {
        Console.WriteLine("ClassCです。");
        this.Num = num;
    }
}

出力は以下のようになります。

ClassCです。
OriginClassです。
Num = 10

new した時の値でClassCのNumが初期化されていますね。

コンストラクタで初期化しなかった場合はどうなるのでしょう。

class OriginClass
{
    public void MainOrigin()
    {
        var classD = new ClassD();
        Console.WriteLine("OriginClassです。");
        Console.WriteLine($"Num = {classD.Num}");
        Console.WriteLine($"Text = {classD.Text}");
    }
}

class ClassD
{
    public int Num;
    public string Text;
}

上記のサンプルを実行すると以下の警告が出てきます。

warning CS0649: フィールド 'ClassD.Num' は割り当てられません。常に既定値 0 を使用します。
warning CS0649: フィールド 'ClassD.Text' は割り当てられません。常に既定値 null を使用します。

出力結果は以下のようになります。

OriginClassです。
Num = 0
Text = 

C#の既定のコンストラクタを使うと、各データ型の既定値で初期化されていますね。

コンストラクタを勉強すると奥が深いようです。
私も引き続き理解を深めていかないとです…。