イベントは単なるデリゲートです。代わりにデリゲート オブジェクトを使用して、通常のイベントと同じように機能するコードを次に示します。
Module Module1
Sub Main()
Dim obj As New Example
obj.AnEvent = New EventHandler(AddressOf Handler)
obj.Test()
Console.ReadLine()
End Sub
Sub Handler(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine("got event")
End Sub
End Module
Class Example
Public AnEvent As EventHandler
Public Sub Test()
If AnEvent IsNot Nothing Then AnEvent(Me, EventArgs.Empty)
End Sub
End Class
ただし、このコードの問題に注意してください。他のコードも AnEvent を混乱させる可能性があります。それを置き換えるか、Nothingに戻すように。ほとんどの場合、これは悲惨なことです。イベントを最初にサブスクライブしたコードは、正しく動作しなくなります。
VB.NETのEventキーワードは、これを防ぎます。デリゲート オブジェクトをラップし、提供されたキーワードを超えて他のコードからアクセスできないようにします。プロパティがフィールドへのアクセスを保護する方法と多少似ています。AddHandler と RemoveHandler は、既存の登録が消えないようにします。RaiseEvent は、Nothingチェックを必要とせずにイベントを発生させます。