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

时间:2011-08-23 23:07:11

标签: 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

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

我还有其他选择吗?

2 个答案:

答案 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