亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

弱参照の続き

d:id:posaunehm:20110302:1299073801 の続きです。

簡単な弱参照の動き検証プログラムをWinFormで作ってみました。

まあつまり、どのタイミングで開放されるかを見ておきたいだけなのですが。
スクショはこんな感じ。
f:id:posaunehm:20110306162544j:image

要は、ボタンを押すと以下の様なコードを実行して、

            _cache.Add(Guid.NewGuid(), new WeakReference(new BigData()));

さらに、以下の様な要領でリストボック氏に_cacheに入っている要素を表示する、という物。
参照が切れていたらnullと表示します。

            listView1.Items.Clear();
            foreach (var item in _cache)
            {
                listView1.Items.Add(
                    new ListViewItem(
                        new string[] 
                        {
                            item.Key.ToString(), 
                            item.Value.Target == null ? "null": item.Value.Target.ToString()
                        }));
            }

弱参照じゃなければ、中の要素が普通に表示されて終わりです。
しかし、弱参照ですから。

まず最初のうちは普通に動きます。
f:id:posaunehm:20110306162545j:image

ところが、GCがどこぞで起こるタイミングで、全部nullに。
f:id:posaunehm:20110306162546j:image

でもでも、またしばらくは普通に追加されていきます。
f:id:posaunehm:20110306162547j:image

まあそんなこんなで、参照があるのにGCされていく、というWeakReferenceの動きを確かめられました。