hakeの日記

Windows環境でプログラミングの勉強をしています。

C# - クラス - コンストラクタとデストラクタ

new演算子によるインスタンス生成時に実行されるのがコンストラクタ、インスタンスの解放時に実行されるのがデストラクタ。コンストラクタは複数の引数パターンを記述可能で、new時に与えられた引数のパターンにより選択されて実行される。
また

     クラス名(引数) : this(引数)

と記述することで、自身の別のコンストラクタを呼び出すことができる。この場合呼び出された方の処理が先に実行されて、その後に呼び出した方の処理が実行される。
クラス名の前に「~」を付けることでデストラクタになる。デストラクタは、インスタンス変数にnullを代入した時点で実行されるわけではなく、ガベージコレクトが実施されるタイミングで実行される。

using System;

//コンストラクタとデストラクタ

class MyClass
{
    private string name = "";
    private int d = 0;
    private double f = 0.0;
    private string s = "";
    
    //コンストラクタ
    //No.1
    public MyClass(string name, int arg)
    {
        Console.WriteLine("インスタンス {0} : コンストラクタ No.1を実行。", name);
        Console.WriteLine("  int型変数に値 {0} を代入しました。", arg);
        this.name = name;
        d = arg;
    }
    //No.2
    public MyClass(string name, double arg)
    {
        Console.WriteLine("インスタンス {0} : コンストラクタ No.2を実行。", name);
        Console.WriteLine("  double型変数に値 {0} を代入しました。", arg);
        this.name = name;
        f = arg;
    }
    //No.3
    public MyClass(string name, string arg)
    {
        Console.WriteLine("インスタンス {0} : コンストラクタ No.3を実行。", name);
        Console.WriteLine("  string型変数に値 \"{0}\" を代入しました。", arg);
        this.name = name;
        s = arg;
    }
    //No.4
    //別のコンストラクタを呼ぶ
    public MyClass(string name, int arg1, double arg2)
                                        : this(name, arg1)//コンストラクタNo.1を呼び実行
    {
        Console.WriteLine("インスタンス {0} : コンストラクタ No.4を実行。", name);
        Console.WriteLine("  double型変数に値 {0} を代入しました。", arg2);
        f = arg2;
    }
    //No.5
    //別のコンストラクタを呼ぶ
    public MyClass(string name, int arg1, double arg2, string arg3)
                                        : this(name, arg1, arg2) //コンストラクタNo.4を呼び実行
    {
        Console.WriteLine("インスタンス {0} : コンストラクタNo.5を実行。", name);
        Console.WriteLine("  string型変数に値 {0} を代入しました。", arg3);
        s = arg3;
    }

    //デストラクタ
    ~MyClass()
    {
        Console.WriteLine("インスタンス {0} でデストラクタ実行", this.name);
    }
}

class MyMain
{
    static void Main(string[] args)
    {
        MyClass a = new MyClass("a", 1);
        MyClass b = new MyClass("b", 0.1);
        MyClass c = new MyClass("c", "hello");
        MyClass d = new MyClass("d", 1, 0.1);
        MyClass e = new MyClass("e", 1, 0.1, "hello");
        
        Console.WriteLine("インスタンス a を解放");
        a = null;

    }
}

 

実行結果

インスタンス a : コンストラクタ No.1を実行。
  int型変数に値 1 を代入しました。
インスタンス b : コンストラクタ No.2を実行。
  double型変数に値 0.1 を代入しました。
インスタンス c : コンストラクタ No.3を実行。
  string型変数に値 "hello" を代入しました。
インスタンス d : コンストラクタ No.1を実行。
  int型変数に値 1 を代入しました。
インスタンス d : コンストラクタ No.4を実行。
  double型変数に値 0.1 を代入しました。
インスタンス e : コンストラクタ No.1を実行。
  int型変数に値 1 を代入しました。
インスタンス e : コンストラクタ No.4を実行。
  double型変数に値 0.1 を代入しました。
インスタンス e : コンストラクタNo.5を実行。
  string型変数に値 hello を代入しました。
インスタンス a を解放
インスタンス e でデストラクタ実行
インスタンス a でデストラクタ実行
インスタンス d でデストラクタ実行
インスタンス c でデストラクタ実行
インスタンス b でデストラクタ実行