ByVal
とVBの違いはかなりよくわかっていると思います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
は期待どおりに機能します (ただし、明らかにイベントは処理できません)
なぜこれが起こっているのか誰にも説明できますか?
PS他の場所でも同様の質問を見つけましたが、私のシナリオでは回避策が機能しません。