【发布时间】:2014-05-09 16:33:07
【问题描述】:
这两种为SQLConnection.StateChange 事件添加事件处理程序的不同方式有什么区别、副作用和/或偏好?由于 AddressOf 创建了一个委托 (http://msdn.microsoft.com/en-us/library/y72ewk2b.aspx),而 StateChangeEventHandler 也是一个委托,因此示例 2 似乎只是在创建嵌套委托,但我猜我缺少一些细微差别。
从我的测试来看,无论是使用示例 1 还是示例 2,它们似乎都可以正常工作。尝试多次调用 AddHandler 时都不会引发异常(我的第一个假设是,如果尝试调用 AddHandler,调用示例 #1 会引发错误第二次,因为它将添加相同的引用,而示例 2 不会添加相同的引用,因为它将是一个新的委托实例;但是,它们都成功而没有例外)。
示例1:仅使用AddressOf:http://msdn.microsoft.com/en-us/library/7taxzxka.aspx
AddHandler conn.StateChange, AddressOf OnConnectionStateChange
示例 2: 使用此处列出的 StateChangeEventHandler 委托的实例:http://msdn.microsoft.com/en-us/library/a0hee08w(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2
AddHandler conn.StateChange, New StateChangeEventHandler(AddressOf OnConnectionStateChange)
另外,在通过RemoveHandler 处理/结束using 块之前是否需要删除此处理程序,或者SQLConnection.Dispose 会为您处理这些?我不确定如果从 MSDN 站点使用下面示例#2 中的StateChangeEventHandler,您将如何删除事件处理程序,因为StateChangeEventHandler 委托的实例未存储在局部变量中,因此您没有参考要删除的处理程序(您必须执行类似于示例 #4 的操作)。
示例 #3: RemoveHandler 仅使用 AddressOf
Using conn As SqlConnection = New SqlConnection("...")
AddHandler conn.StateChange, AddressOf OnConnectionStateChange
conn.Open()
'...do work here...
conn.Close()
'Then do i need this?
RemoveHandler conn.StateChange, AddressOf OnConnectionStateChange
End Using
示例 #4: RemoveHandler 使用 StateChangeEventHandler
Using conn As SqlConnection = New SqlConnection("...")
Dim myHandler As StateChangeEventHandler = New StateChangeEventHandler(AddressOf OnConnectionStateChange)
AddHandler conn.StateChange, myHandler
conn.Open()
'...do work here...
conn.Close()
'Then do i need this?
RemoveHandler conn.StateChange, myHandler
End Using
注意:我也标记为 C#,因为 MSDN 文档还列出了 C# 示例的相同场景:
connection.StateChange += new StateChangeEventHandler(OnStateChange);
对比
connection.StateChange += OnStateChange;
【问题讨论】:
标签: c# .net vb.net events event-handling