测试用例:
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
当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
但即使在这里,似乎处理程序在New
完成之后才会注册。
但是,在现实生活中,事件是在代码中引发的,这些代码在语义上是对象初始化的一部分,而我真的不需要创建一些Initialize
函数。
我还有其他选择吗?
答案 0 :(得分:8)
在构造函数中放置引发事件的代码是没有意义的,除非在同一构造函数中执行的某些其他代码能够注册以处理事件(例如通过某种间接方法调用)。反过来,在构造函数完成之前需要泄漏Me
,这通常是一个坏主意。
基本上:尽量避免这种设计。在构造过程中,对象不应该对外界可见,并且包括事件处理程序。
答案 1 :(得分:1)
我同意Jon关于将事件放入构造函数中的问题 - 特别是因为标准事件模式确实在事件调用中公开了发送者的实例,正如Jon正确地说,这是一个坏主意。
然而,如果你只传递价值,这不是一个坏主意。你可以轻松地做到这一点。
试试这个:
Public Class T
Public Sub New(a As Action)
a()
End Sub
End Class
Module Module1
Sub Main()
Dim obj = New T(AddressOf handleA)
End Sub
Sub handleA()
Debug.WriteLine("!")
End Sub
End Module