【C#】コンストラクタ / デストラクタ

■ コンストラク

 * C#のコンストラクタは、Javaとは異なるのでメモ。

■ :this()

 * 別のコンストラクタを呼び出す

サンプル

public class SampleConstractorClass
{
    public SampleConstractorClass()
    {
        Console.WriteLine("Call!");
    }
    public SampleConstractorClass(string a)
        : this()
    {
        Console.WriteLine("Call : " + a);
    }
    public SampleConstractorClass(int b)
        : this("from b")
    {
        Console.WriteLine("Call : " + b);
    }
    public SampleConstractorClass(double c)
    {
        Console.WriteLine("Call : " + c);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    SampleConstractorClass t1 = new SampleConstractorClass();
    Console.WriteLine();
    SampleConstractorClass t2 = new SampleConstractorClass("t2");
    Console.WriteLine();
    SampleConstractorClass t3 = new SampleConstractorClass(3);
    Console.WriteLine();
    SampleConstractorClass t4 = new SampleConstractorClass(4.5);
    Console.WriteLine();
}
出力結果
Call!

Call!
Call : t2

Call!
Call : from b
Call : 3

Call : 4.5

■ :base()

 * :base()は、以下のような問題を解決できる
問題点
 * クラスに継承関係がある時、継承元クラスのコンストラクタ実行後、
   継承先クラスのコンストラクタが実行されるが、継承元クラスのコンストラクタへ引数は渡せない。
 * 引数の無いコンストラクタが定義されていないクラスの場合、コンパイルエラーとなってしまう

サンプル

public class ClassBase
{
    public ClassBase()
    {
        Console.WriteLine("Call Base!");
    }
    public ClassBase(string a)
    {
        Console.WriteLine("Call Base: " + a);
    }
}
public class ClassSub : ClassBase
{
    public ClassSub()
    {
        Console.WriteLine("Call Sub!");
    }
    public ClassSub(string a)
        : base(a + " from Sub") // ★
    {
        Console.WriteLine("Call Sub: " + a);
    }
    public ClassSub(int b)
    {
        Console.WriteLine("Call Sub: " + b);
    }
}
private void buttonF_Click(object sender, EventArgs e)
{
    ClassBase t1 = new ClassBase();
    Console.WriteLine();
    ClassBase t2 = new ClassBase("t2");
    Console.WriteLine();
    ClassSub t3 = new ClassSub();
    Console.WriteLine();
    ClassSub t4 = new ClassSub("t4");
    Console.WriteLine();
    ClassSub t5 = new ClassSub(5);
    Console.WriteLine();
}
出力結果
Call Base!

Call Base: t2

Call Base!
Call Sub!

Call Base: t4 from Sub
Call Sub: t4

Call Base!
Call Sub: 5