Visual Basic のイベント (Events) は、オブジェクトがアプリケーションの他のコンポーネントに発生した変更を通知することを可能にします。イベントは Event キーワードを使って宣言されます。RaiseEvent メソッド (VB.NET) または Raise (VB6) を使って呼び出され、コンポーネントはそれにサブスクライブできます (Handles / WithEvents)。
VB.NET の例:
Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...何らかの作業 RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("作業が完了しました!") End Sub End Class
重要なポイント:
WithEvents はクラスのフィールドおよびプロパティに対してのみ使用できますアクセス修飾子
Privateでイベントを宣言し、他のクラスからそれにサブスクライブすることはできますか?
答え: いいえ、Private 修飾子はイベントの可視性をそれが宣言されたクラスのみに制限します。他のクラスはそれを認識できないため、サブスクライブすることはできません。
物語
大規模なアプリケーションでは、イベントは
Public修飾子で作成されましたが、明示的にどこにもサブスクリプション解除していませんでした。アプリケーションが長時間動作すると、不要なオブジェクトを参照しているため、メモリリークが発生しました。
物語
VB6 から VB.NET への移行時に、開発者はイベントがすべてのモジュールで利用できると期待しましたが、デフォルトではイベントは
Friendでした。その結果、ハンドラーはトリガーされず、このバグは統合テストでのみ発見されました。
物語
プログラマーはイベントのデリゲートのシグネチャで
senderとeの順序を逆にしてしまいました。エラーメッセージは一切表示されず (イベントハンドラーは単に呼び出されなかった)、必要なビジネスロジックが半ファイナルリリースまで見逃されました。