VB.NET質問スレ (Part10)at TECH
VB.NET質問スレ (Part10) - 暇つぶし2ch369:デフォルトの名無しさん
05/03/21 20:34:25
一応技術的な解説をしとこう。

イベントは、対応する引数・返値を持ったデリゲートの一種のプロパティだ。
デリゲートというのは、メソッドへの参照リストを保持する特殊なクラス。
Event Hogeを宣言すると、VB.NETコンパイラは以下の操作を行う。

・MulticastDelegateを継承するHogeEventHandlerクラスを作成する
・HogeEventHandler型のフィールドHogeを追加する
・メソッドadd_Hogeとメソッドremove_Hogeを追加する

イベントの実体は結局の所デリゲートの派生クラスであるHogeEventHandler型のフィールドHogeである。

AddHandlerステートメントは、まずメソッドの参照をラップするHogeEventHandlerインスタンスを作成する。
その後add_Hogeを呼び出して、フィールドHogeと作成したインスタンスを合成し、新しくHogeとする。
これでHogeにはメソッドの参照であるHogeEventHadlerインスタンスのリストがあることになる。
//このリストは飽くまでインスタンスの参照のリストである、という点を忘れてはいけない。クラスインスタンスは全て参照でやりとりを行う。

RaiseEventステートメントを使うと、このメソッドリストを最初から順に実行していくわけだ。

さて、Hogeが持ってるのはHogeEventHandlerインスタンスのリストである。
それぞれのHogeEventHandlerインスタンスはこのHogeからしか参照されていないわけで、
Hogeが他から参照されなくなると、自動的に各HogeEventHandlerインスタンスも他からの参照はなくなる。つまりGCの対象となる。
ではHogeの参照を持っているのは、というと(SharedのEventでない限りでない限り)、
Eventを持ってるクラスのインスタンスが
・明示的にHogeにNothingを代入する(ただしVB.NETでは不可能)
・クラスのインスタンス自身が他から参照されなくなった
といった状況だ。
つまり、クラスのインスタンスがGCされる状況では必ずHogeとHogeが持っているHogeEventHandlerインスタンス達もGCの対象になっているというわけだ。

あと、RemoveHandlerすればHogeからHogeEventHandlerインスタンス(の参照)が一つはずれる。
はずされたHogeEventHandlerは当然他からの参照されていないためGCの対象になる。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch