如何处理在New中引发的事件?

Lig*_*ica 2 vb.net events

测试用例:

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)

当然,AddHandlerNew被解雇时还没有运行.

所以我试着这样:

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函数.

我还有其他选择吗?

Jon*_*eet 8

放置在构造函数中引发事件的代码是没有意义的,除非在同一构造函数中执行的某些其他代码能够注册以处理事件(例如通过某种间接方法调用).反过来Me,在构造函数完成之前需要泄漏,这通常是一个坏主意.

基本上:尽量避免这种设计.在构造期间,对象不应该对外部世界可见,并且包括事件处理程序.

  • @Tomalak:在构造函数中,对象是半成形的.这不是一个很好的工作状态.仍然可以运行派生类构造函数,执行任何虚拟方法是狡猾的等等.如果你必须,你可以将事件处理程序传递给构造函数...但是,否则,你会怎么想订阅活动的其他任何事情? (2认同)