Visual Basic .NET において、デリゲート (Delegate) はメソッドへの参照をカプセル化するオブジェクトであり、イベント (Events) は特定の条件や変更が発生したことを購読者に通知するメカニズムです。デリゲートは動作(メソッド)をパラメータとして「渡す」ことを可能にし、イベントはパブリッシャー-サブスクライバーのパターンを実装しています。
特徴:
Event キーワードを使用して宣言されます。AddHandler を介して行われ、退会は RemoveHandler を介して行われます。例:
' デリゲートの定義 Public Delegate Sub NotifyHandler(ByVal message As String) ' イベントを持つクラス Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("作業が完了しました!") End Sub End Class ' 購読と呼び出し Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
イベントは特に UI プログラミングやビジネスロジックのディスパッチに役立ちます。
RaiseEvent を呼び出した場合、購読者がいなければどうなりますか?
誤った回答: 実行時エラーが発生します。
正しい回答: 何も起こりません - イベントに購読者がいない場合、RaiseEvent の呼び出しは安全で、例外は発生しません。
例:
Public Event OnUpdate() ' 誰も購読していなくても RaiseEvent を呼び出す: RaiseEvent OnUpdate() ' 許可されており、エラーは発生しません
事例
大規模なデスクトップアプリケーションで、開発者がイベントからハンドラーを退会しなかったため、オブジェクトがガベージコレクターによって解放されず(メモリリーク)、数時間の作業でメモリが増加し、クラッシュを引き起こしました。
事例
若手の専門家は、デリゲートとイベントの動作を理解せずに、意図せず同じメソッドを何度も購読しました。これにより同じハンドラーが複数回呼び出され、ユーザーは重複した通知を受け取りました。
事例
あるプロジェクトでRaiseEventが呼び出され、必ず動作するはずだと思い込んでいました。テストで、購読者がいない場合は効果がなく、アプリケーションのビジネスロジックに誤解をもたらし、報告書に誤りを引き起こしました。