.net - 在更改对对象的引用时,Visual Basic 中的 WithEvents 是否保留其 EventHandlers?

标签 .net vb.net events event-handling handles

是否WithEvents在 Visual Basic 中保持其 EventHandler s 何时更改对对象的引用?

假设我已经声明了一个按钮,触发事件:

Private WithEvents _MyButton

现在我订阅了一个事件处理程序:
Private Sub _MyButton_Click() Handles _MyButton.Click 
  ' Here I DoClick()
End Sub

请问DoClick()当我更改按钮对象的实例时仍然调用函数,如下所示?
_MyButton = New Button()

最佳答案

这让我很好奇,所以我编写了一个小型控制台应用程序来可视化如果您使用计时器进行此实验会发生什么:

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关键词。无论如何,答案是肯定的。

关于.net - 在更改对对象的引用时,Visual Basic 中的 WithEvents 是否保留其 EventHandlers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15335201/

相关文章:

c# - 如何使用 LINQ to SQL 连接到 SQL Server?

c# - 使用 vb 返回 IEnumerable 时,Asp.net 4.5 模型绑定(bind)中断?

c# - 使用 MVVM 实现搜索功能

vb.net - 确定动态创建的按钮上的单击类型(向右或向左)

mysql - 从代码中检索表名和列名

jquery - e.stopPropagation 可以工作,但在控制台中出现错误

Java 确认退出

javascript - 单击 Flash 时事件不会在某些浏览器中冒泡

c# - 检查.NET 3.5中对给定实例保留了多少引用

c# - 如何在 matlab 中创建 dll 并在 .Net 应用程序中使用这些 dll