【.NET】弱いつながりでWeakReference

  • 2008.11.27 Thursday
  • 02:48
WeakReference

Source and Project

昨日、IWeakEventListenerを紹介させていただきました。
それで今日は「弱い」つながりでWeakReferenceを動きをちょっとだけみてみました。

WeakReferenceはMSDNの噂によると...

WeakReference クラス
"弱い参照" を表します。弱い参照は、オブジェクトがガベージ コレクションによるクリアの対象になっている状態のままで、そのオブジェクトを参照します。

http://msdn.microsoft.com/ja-jp/library/system.weakreference.aspx


MSDNのサンプルコードはなかなか奇妙奇天烈で、わかりにくいです。

ということで、今回はシンプルなサンプルコード書いてみて動きを見てみました。
これはむしろGC.Collect()の動きを確かめているだけのような気がしなくでもないわけですが・・・


 class Program
 {
  static void Main(string[] args)
  {
   var weakReferenceList = new List<WeakReference>();
   var referenceList = new List<Data>();

   for (int i = 0; i < 12; i++)
   {
    var data = new Data();
    if (i % 2 == 0)
     referenceList.Add(data);
    weakReferenceList.Add(new WeakReference(data, false));
    data = null;
   }

   GC.Collect();

   foreach (WeakReference weakReference in weakReferenceList)
   {
    var data = (Data) weakReference.Target;
    if (data != null)
     Console.WriteLine(weakReferenceList.IndexOf(weakReference) + " is Alive.");
    else
     Console.WriteLine(weakReferenceList.IndexOf(weakReference) + " is not Alive.");
   }
  }
 }

 class Data
 {
  public Data()
  {
   Item = new byte[1024];
  }
  public int Index { get; set; }
  public object Item { get; set; }
 }


ちなみに

   for (int i = 0; i < 12; i++)
   {
    ...
    data = null;
   }

のdata = nullを入れていなくて、必ず最後の項目がガベージュコレクトされず
Listの末尾だから?なんてアホな想像を5分ぐらいしてしまいました。

実行結果は下記のとおり
------------------------------
0 is Alive.
1 is not Alive.
2 is Alive.
3 is not Alive.
4 is Alive.
5 is not Alive.
6 is Alive.
7 is not Alive.
8 is Alive.
9 is not Alive.
10 is Alive.
11 is not Alive.

WeakReferenceは誰からも参照されていないものを集める場合に便利そうです。
いや、むしろ参照されているものを集めるのに便利そうと言うべきか・・・。



絵で描いたらわかりやすいなぁ〜って思って書いてみました。

TargetとなるオブジェクトをA, B, WeakReferenceのオブジェクトが
それぞれ参照していたとします。
このときは当然、AとBが参照しているのでTargetオブジェクトはGCの対象とはなりません。

WeakReference


しかし、AとBの参照が何らかの理由でなくなり、WeakReferenceだけが
Targetオブジェクトを参照していた場合、TargetオブジェクトはGCの対象となります。

WeakReference


さらにガベージュコレクト走るとTargetオブジェクトはゴミ箱へ行ってしまい、
WeakReferenceの参照先はnullになってしまいます。
そのためWeakReferenceのオブジェクトがたとえばwという名前だった場合
w.Targetはnullを返すわけです。

WeakReference



ちなみに絵を使って説明したかったわけではなく
単にゴミ箱が書きたかったというのは内緒にしておいてください。


Source and Project
コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< January 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM