我有一个全局变量:
Public myPerson As New Person
然后我附上一个事件处理程序:
AddHandler myPerson.OnClose, AddressOf DoWhatever
然后在程序的其他地方重新创建我的对象:
myPerson = New Person
我的事件处理程序是否仍会附加到新的myPerson,还是需要再次添加?
答案 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
将不会删除事件处理程序,因为Person2
和Person3
仍然引用类实例。
这个小提琴说明了我在说什么:https://dotnetfiddle.net/8XiH19
如您所见,唯一报告已关闭的人是约翰,由Person2
引用,而在新实例化的人上调用myPerson.Close()
则没有产生任何结果。
如果我再次添加相同的处理程序,那么它会被调用两次,因为我会有两个相同的处理程序连接两次吗?
没有。如上所述,事件处理程序特定于类实例,而不是变量。