C#のクラス - コンストラクター

C#のクラスにはコンストラクターと呼ばれる特殊なメソッドが存在します。
コンストラクターはクラスのインスタンスが生成された時(キーワード(予約語) new が使われた時)に自動的に呼び出されます。

インスタンスの生成時に呼び出される為、フィールド(メンバー変数)などの初期化を行なう為に使われます。



コンストラクターの定義

コンストラクターは通常のメソッドとは以下の点で異なります。
  • クラス名と同じ名前で定義する
  • 戻り値は定義しない(戻り値はない)
public class TestClass
{
    private int TestField;

    public TestClass()     //コンストラクター
    {
        TestField = 100;
    }
}


コンストラクターの省略

コンストラクターは省略する事が可能です。
特別は初期化が必要ない場合はコンストラクターを記述する必要はありません。
省略された場合、フィールド(メンバー変数)は既定値によって初期化されます。
public class TestClass
{
}


パラメータを持ったコンストラクター

コンストラクターは通常のメソッドと同じようにパラメータを定義する事も可能です。
コンストラクターがパラメータを持つクラスのインスタンスを作成する時は、キーワード(予約語) new を使う時にパラメータを指定する必要があります。
public class TestClass
{
    private int TestField;

    public TestClass(int num)     //コンストラクター
    {
        TestField = num;
    }
}

public class Program
{
    public static Main()
    {
        TestClass test;
    
        test = new TestClass(100); // インスタンス生成時にパラメータを渡す
    }
}


パラメータの異なる複数のコンストラクター

C#ではパラメータの異なる同じ名前のメソッドを複数定義できるオーバーロードという仕組みがあります。
コンストラクターもオーバーロードが可能です。
複数定義されたコンストラクターのどれが呼び出されるかは、インスタンスを作成する時のパラメータの指定によって決まります。
public class TestClass
{
    private int TestField;

    public TestClass()                     //コンストラクター(パラメータなし)
    {
        TestField = 10;
    }

    public TestClass(int num)              //コンストラクター(パラメータ1つ)
    {
        TestField = num;
    }

    public TestClass(int num1, int num2)   //コンストラクター(パラメータ2つ)
    {
        TestField = num1 + num2;
    }
}

public class Program
{
    public static Main()
    {
        TestClass test1;
        TestClass test2;
        TestClass test3;
    
        test1 = new TestClass();            // コンストラクター(パラメータなし)が呼ばれる TestField=10
        test2 = new TestClass(20);          // コンストラクター(パラメータ1つ)が呼ばれる TestField=20
        test3 = new TestClass(20, 10);      // コンストラクター(パラメータ2つ)が呼ばれる TestField=30
    }
}


コンストラクタからコンストラクターを呼ぶ

オーバーロードの仕組みによって複数のコンストラクターを定義できますが、同じような作業はなるべくソースコードを共通にしておきたいものです。
キーワード(予約語) this を使う事で他のコンストラクターを呼び出して実行する事が可能です。
public class TestClass
{
    private int TestField1;
    private int TestField2;

    public TestClass()
    {
        TestField1 = 10;
        TestField2 = 20;
    }

    public TestClass(int num) : this()                 //this()により、まずパラメータなしのコンストラクターが呼び出される
    {
        TestField2 = num;                              //パラメータなしのコンストラクターが呼び出された後ココが実行される
    }

    public TestClass(int num1, int num2) : this(num1)  //this(num1)により、まずパラメータ1つのコンストラクターが呼び出される
    {
        TestField1 = num1 + num2;                      //パラメータ1つのコンストラクターが呼び出された後ココが実行される
    }
}



コメント