[Memo] デストラクタが呼ばれるタイミングの検証 その1

デストラクタが呼ばれるタイミングの検証をしたので、そのメモです。
(このサンプルは、コンソールアプリケーションとして作成して検証しています)

まず、新規でSampleクラス(Sample.cs)を作成して、以下のようなコードを書きます。
これで、コンストラクタが実行されると「コンストラクタが呼び出されました。」、デストラクタが実行されると「デストラクタが呼び出されました。」を表示します。

class Sample
{
    public Sample()
    {
        Console.WriteLine("コンストラクタが呼び出されました。");
    }

    ~Sample()
    {
        Console.WriteLine("デストラクタが呼び出されました。");
    }
}

次に、Program.cs を開いて以下のように編集します。

class Program
{
    static void CreateSample()
    {
        Console.WriteLine("Sampleのインスタンス生成");

        new Sample();

        Console.WriteLine("Sampleのインスタンス生成終了");
    }

    static void Main(string[] args)
    {
        Console.WriteLine("開始");

        CreateSample();

        Console.WriteLine("終了");

        Console.ReadLine();
    }
}

このコードを実行すると

  1. 開始
  2. Sampleのインスタンス生成
  3. コンストラクタが呼び出されました
  4. デストラクタが呼び出されました
  5. Sampleのインスタンス生成終了
  6. 終了

と表示されるのではないかと推測されます。
で、実行してみるとどうなるか?
以下が実行結果です。

実行結果1

あれ?「デストラクタが呼び出されました。」が表示されない。
Sampleクラスのデストラクタは実行されなかったのかというとそうではなく、「終了」の後に実行されています。
今のプログラムでは、「デストラクタが呼び出されました。」の文字が表示される前にコンソールウィンドウが閉じてしまうため、Sampleクラスのデストラクタを以下のように修正し再度実行をします。

~Sample()
{
    Console.WriteLine("デストラクタが呼び出されました。");
    Console.ReadLine();
}

実行結果は以下の通りです。

実行結果2
見てわかる通り、「終了」のあとにデストラクタが呼び出されています。
このように、デストラクタが呼び出されるタイミングは、必ずしもクラスを使い終わったときとはならないようです。

次回へ続く…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください