.NETにおけるオブジェクトの生存期間
.NETにおけるオブジェクトの生存期間は、参照されている間です。
たとえば、以下のようなMainメソッドあるとします。

using System;
using System.Threading;

namespace TimerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Timer t = new Timer(TimerCallback, null, 0, 2000);

            // タイミングA
            Console.ReadLine();

            // オブジェクトtの参照
            Console.WriteLine(t.ToString());

            // タイミングB
            Console.ReadLine();

        }

        private static void TimerCallback(Object o)
        {
            Console.WriteLine("Callback" + DateTime.Now);
            GC.Collect();
        }

    }
}


オブジェクトtの生存期間はどこまでか?
Mainメソッドが終了するまでは保障されません


最後にオブジェクトを参照したところまでしか保証されません。


つまり、タイミングAにおいてはオブジェクトtは存在しますが、タイミングBおいてオブジェクトtの存在は保障されないのです。
オブジェクトtを参照したのちにガベージコレクションが実行されたとしたら、もはやオブジェクトtは存在しなくなります。


ちなみにこのコードはReleaseビルド時とDebugビルド時に挙動が変わります。Debugビルドを行った場合、JITコンパイラはメソッドの末尾まで恣意的にオブジェクトの生存期間を延ばします


このことは我々に「テストはReleaseビルドでやるべきだ」という教訓をあたえてくれるでしょう。


なお、ReadLine()の後もオブジェクトtが欲しい場合、Mainメソッドの最後に以下を記述すべきです。

       t.Dispose();



[PR]
by mima_ita | 2013-12-02 14:00 | .NET
<< Windos7 SP1がWin... .NETにおける64ビットプロ... >>



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ