我覺得我有一個相當不錯的想法,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之前」的語言,因此對此的幫助有點分散,並不容易在網絡上找到。 –