- 369 名前:デフォルトの名無しさん mailto:sage [2005/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の対象になる。
|

|