0


为什么事件处理程序在我尝试以与按预期引发和处理私有事件相同的方式引发私有事件时创建的对象时不响应事件

Public Class Form1
    Dim WithEvents nClass As Class1
    Private Sub nClass_Created(ByVal sender As Object, ByVal e As System.EventArgs) Handles nClass.Created
        MessageBox.Show("Created !")
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        nClass = New Class1
    End Sub
End Class

Public Class Class1
    Event Created(ByVal sender As Object, ByVal e As EventArgs)
    Sub New()
        'some codes

        'when finish
        RaiseEvent Created(Me, New EventArgs)
    End Sub
End Class
4

1 回答 1

2

从逻辑上讲,这个概念被打破了。为了引发事件,必须有一个附加到事件的事件处理程序。为了附加处理程序,对象必须存在。为了存在,构造函数必须完成。您将永远无法让构造函数引发事件,因为在构造函数运行时委托列表将为空(不会添加任何处理程序)

这在 C# 中会更容易看到,这就是我们将事件附加到事物的方式:

var thing = new Thing();
thing.Event += new EventHandler(NameOfSomeMethod);

VB 有一个类似的结构:

Dim thing as New Thing()
AddHandler(thing.Event, AddressOf(NameOfSomeMethod))

如您所见,必须先构建事物。构造函数代码当然可以调用事件,但不会附加任何处理程序,因此不会发生任何事情

如果您想在每次创建对象时收到通知,请使用工厂模式;构造您的类的类可以引发该类已创建的事件

于 2020-05-31T20:52:21.893 回答