[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 06/08 14:41 / Filesize : 240 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

VB.NET質問スレ (Part10)



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の対象になる。






[ 続きを読む ] / [ 携帯版 ]

全部読む 前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<240KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef