再次进行对象实例化后的事件处理程序的范围

时间:2016-10-29 23:16:34

标签: vb.net

我有一个全局变量:

Public myPerson As New Person

然后我附上一个事件处理程序:

AddHandler myPerson.OnClose, AddressOf DoWhatever

然后在程序的其他地方重新创建我的对象:

myPerson = New Person

我的事件处理程序是否仍会附加到新的myPerson,还是需要再次添加?

1 个答案:

答案 0 :(得分:1)

  

我的事件处理程序是否仍会附加到新的myPerson或我是否需要再次添加它?

事件处理程序特定于该类的每个实例。执行myPerson = New Person时,实例化一个具有自己的引用,变量和事件的Person类的全新实例。

请记住,仅仅因为你引用相同的变量,它并不意味着它是同一个类实例。类实例可以由多个变量引用。例如,这里:

Dim Person1 As New Person
Dim Person2 As Person = Person1
Dim Person3 As Person = Person1

AddHandler Person1.OnClose, AddressOf DoWhatever

所有三个变量都引用Person类的相同实例。因此,如果您在Person3上调用引发OnClose事件的内容,则仍会调用事件处理程序。

  

如果答案是 - 否则会被处理

如果您手动分离处理程序或垃圾收集器处理/收集您的第一个实例,则只会处理/分离处理程序。在上面的示例中,重新定位/更改Person1将不会删除事件处理程序,因为Person2Person3仍然引用类实例。

这个小提琴说明了我在说什么:https://dotnetfiddle.net/8XiH19

如您所见,唯一报告已关闭的人是约翰,由Person2引用,而在新实例化的人上调用myPerson.Close()则没有产生任何结果。

  

如果我再次添加相同的处理程序,那么它会被调用两次,因为我会有两个相同的处理程序连接两次吗?

没有。如上所述,事件处理程序特定于类实例,而不是变量。