测试用例:
Public Class T
Public Event A()
Public Sub New()
RaiseEvent A()
End Sub
End Class
Module Module1
Sub Main()
Dim obj = New T()
AddHandler obj.A, AddressOf handleA
End Sub
Sub handleA()
Debug.WriteLine("!")
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
当然,AddHandler
当New
被解雇时还没有运行.
所以我试着这样:
Public Class T
Public Event A()
Public Sub New()
RaiseEvent A()
End Sub
End Class
Module Module1
Dim WithEvents obj As T
Sub Main()
obj = New T()
End Sub
Sub handleA() Handles obj.A
Debug.WriteLine("!")
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
但即使在这里,似乎处理程序直到New
完成后才会注册.
但是,在现实生活中,事件是在代码中引发的,这些代码在语义上是对象初始化的一部分,而我真的不需要创建一些Initialize
函数.
我还有其他选择吗?
放置在构造函数中引发事件的代码是没有意义的,除非在同一构造函数中执行的某些其他代码能够注册以处理事件(例如通过某种间接方法调用).反过来Me
,在构造函数完成之前需要泄漏,这通常是一个坏主意.
基本上:尽量避免这种设计.在构造期间,对象不应该对外部世界可见,并且包括事件处理程序.