1

特に VB.NET について質問していますが、一般的な原則は他の言語でも同じだと思います。イベントは .NET の第一級の概念だと思っていましたが、振り返ってみるとイベントが発生したときに呼び出される特定のメソッドに過ぎないようです。

  1. メソッドを動的にAddHandler変更RemoveHandlerするにはどうすればよいですか(AFAIK、イベントは日付より前ですか?DynamicMethod
  2. メソッドはどのようにRaiseEvent呼び出されますか?
  3. AddHandlerRemoveHandler、およびがメソッドではなくステートメントRaiseEventとして実装されるのはなぜですか?
4

2 に答える 2

1

イベントは単なるデリゲートです。代わりにデリゲート オブジェクトを使用して、通常のイベントと同じように機能するコードを次に示します。

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チェックを必要とせずにイベントを発生させます。

于 2013-04-29T15:13:36.683 に答える