コンストラクタ

定義

C#にはC++のイニシャライザのような仕組みは存在せず、定義時に初期化します。

class MyClass
{
    int a = 1;
    const int b = 1;

    public MyClass()
    {
    }
}

多重定義 (オーバーロード)

多重定義したコンストラクタから他のコンストラクタを呼ぶには、thisキーワードを用いてイニシャライザのように記述します。

class MyClass
{
    public MyClass(            ) : this(0, 0, null) {} // 他のコンストラクタを呼ぶだけ
    public MyClass(int x, int y) : this(x, y, null) {} // 他のコンストラクタを呼ぶだけ

    public MyClass(int x, int y, string s)
    {
        // コンストラクタの実装
    }
}
10.10.6 省略可能なインスタンス コンストラクタ パラメータ (C#) | MSDN

継承 (Inheritance)

派生クラスから基本クラスのコンストラクタを呼ぶには、baseキーワードを用います。base (C# リファレンス) - desc | MSDN

baseで呼び出すコンストラクタを明示しない場合は、引数のないコンストラクタが呼ばれます。基本クラスに引数のないコンストラクタが定義されていないときは、baseで明示しなければCS7036のエラーとなります。

class BaseClass
{
    public BaseClass() {}
    public BaseClass(int a) {}
}

class SubClass : BaseClass
{
    public SubClass() : this(1, 2)
    {
        // BaseClass() が呼ばれてから、SubClass(int, int) が呼ばれる
    }

    public SubClass(int a) : base(a)
    {
        // BaseClass(int) が呼ばれる
    }

    public SubClass(int a, int b)
    {
        // BaseClass() が呼ばれる
    }
}

静的コンストラクタ (static constructor)

静的コンストラクタは、

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

とも呼ばれます。この静的コンストラクタにはアクセス修飾子やパラメータは許されず、static ClassName()の構文のみです。

class MyClass
{
    static readonly int a;

    static MyClass()
    {
        a = 1;
    }

    public MyClass()
    {
        a = 1; // error CS0198: 静的読み取り専用フィールドへの割り当てはできません (静的コンストラクターまたは変数初期化子では可)。
    }
}
静的コンストラクター (C# プログラミング ガイド) | Microsoft Docs | MSDN

オブジェクトの生成

new演算子

MyClass obj  = new MyClass();

匿名型のインスタンスは、次のように生成できます。

var a = from f in MyClass
    select new {X = f.X};

オブジェクト初期化子 (Object initializers)

オブジェクト初期化子を用いると、アクセス可能なフィールドとプロパティにオブジェクトの生成時に値を割り当てられます。オブジェクト初期化子 - オブジェクト初期化子とコレクション初期化子 - C# プログラミング ガイド | Microsoft Docs

たとえば次のようにクラスが定義されているとき、

class MyClass
{
    private int a;
    public int b;

    public int C { get; set; }
}

通常ならばオブジェクトの生成後に値を割り当てる処理を、

MyClass obj1 = new MyClass();
obj1.b = 1;
obj1.C = 2;

オブジェクトの生成時に割り当てられます。

MyClass obj2 = new MyClass()
{
  //a = 0, // error CS0122: 'MyClass.a' はアクセスできない保護レベルになっています
    b = 1,
    C = 2
};

このとき引数のないコンストラクタを呼ぶならば、コンストラクタのかっこを省略できます。

MyClass obj3 = new MyClass
{
    b = 1,
    C = 2
};

参考

参考書

MSDN (Microsoft Developer Network) から検索