我觉得我有一个相当不错的想法,VB中的ByVal
和ByRef
有什么区别,但是我的问题是,当我尝试将它与一个用WithEvents
声明的成员结合使用时。为什么ByRef不能与WithEvents一起使用?
我有以下方法:
Private Sub SafeCloseAndDeRefConnection(ByRef cnx As ADODB.Connection)
On Error GoTo ErrH
If Not cnx Is Nothing Then
If (cnx.State And adStateConnecting) = adStateConnecting Then
cnx.Cancel
End If
If (cnx.State And adStateOpen) = adStateOpen Then
cnx.Close
End If
Set cnx = Nothing
End If
Exit Sub
ErrH:
Set cnx = Nothing
End Sub
如果我有一类成员宣布为:
Private WithEvents Connection As ADODB.Connection
那么我想关闭连接,然后调用它是这样:
SafeCloseAndDeRefConnection Connection
但是在拨打SafeCloseAndDeRefConnection
之后,Connection
变量是不是设置为Nothing
,仍然有其原始参考。
如果我删除WithEvents
关键字调用SafeCloseAndDeRefConnection
按预期工作(但显然事件可以再无法处理)
谁能向我解释为什么发生这种情况?
P.S.我找到了类似question elsewhere,但解决方法在我的方案中不起作用。
'WithEvents'对象不能被传递给'ByRef',如果你尝试传递一个“copy”,就好像你声明了'ByVal'一样。它必须是这种方式来管理连接和断开实际对象的传出事件接口和客户端的接收器对象。 – Bob77
尝试实现一个“流利”功能,然后您可以像这样使用'Set Connection = SafeCloseAndDeRefConnection(Connection)' – wqw
@ Bob77感谢您的回复。它有点意义(和VB一样合理)。你可能有更详细的解释这个参考吗? VB6是一种“Web 2.0之前”的语言,因此对此的帮助有点分散,并不容易在网络上找到。 –