5

WithEventsVisual BasicEventHandlerでは、オブジェクトへの参照を変更するときにsを保持しますか?

ボタンを宣言し、イベントを発生させたとしましょう。

Private WithEvents _MyButton

今、私はイベントハンドラーを購読しています:

Private Sub _MyButton_Click() Handles _MyButton.Click 
  ' Here I DoClick()
End Sub

以下に示すようにボタンオブジェクトのインスタンスを変更しても、DoClick()関数は引き続き呼び出されますか?

_MyButton = New Button()
4

1 に答える 1

3

これに興味を持ったので、タイマーを使用してこの実験を行った場合に何が起こるかを視覚化する小さなコンソールアプリケーションを作成しました。

Private WithEvents _t As New Timers.Timer With {.Enabled = True}
Private Sub _t_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles _t.Elapsed
    Console.WriteLine("tick")
End Sub

Sub Main()
    ' let it tick for 5 seconds
    Task.Delay(5000).Wait()

    ' destroy the current timer
    Console.WriteLine("destroying this timer")
    _t.Dispose()
    _t = Nothing

    ' add a little pause
    Task.Delay(1000).Wait()

    ' create a new timer
    Console.WriteLine("creating a new timer")
    _t = New Timers.Timer With {.Enabled = True}

    ' let it tick for 5 seconds
    Task.Delay(5000).Wait()

End Sub

このコードを実行すると、のインスタンス_tが置き換えられたときに実際にイベントハンドラーがアタッチされることがわかります。それがどのように行われるかはわかりませんが、魔法はおそらくHandlesキーワードにあります。とにかく、答えはイエスです。

于 2013-03-11T12:06:23.460 に答える