初めて質問します。環境はVB.NETなのですが、VB.NET2005のサンプルで
Public Sub ReleaseInstance(Of ObjType)(ByRef Obj As ObjType)
If Not Obj Is Nothing Then
Marshal.ReleaseComObject(Obj)
Obj = Nothing
End If
End Sub
のようなソースがあり、VB.NET2003では、ofが使えませんでした。何か、良い方法はありませんでしょうか。
よろしくお願いします
たとえば、
Dim comObj As Object = CreateObject("ADODB.Connection")
ReleaseInstance(comObj)
のように、(COM オブジェクトを保持している)Object 型を
渡すのだけを目的とするのであれば、宣言側は
Public Sub ReleaseInstance(ByRef Obj As Object)
だけで済むでしょう。
問題は、
Dim comObj As ADODB.Connection = New ADODB.ConnectionClass()
ReleaseInstance(comObj)
のように、非Object型を処理したいような場合ですね。
この場合、幾つかの対応策があります。
=====(1)=======================
メソッド定義を
Public Sub ReleaseInstance(ByRef Obj As Object)
Public Sub ReleaseInstance(ByRef Obj As ADODB.Connection)
Public Sub ReleaseInstance(ByRef Obj As Excel.Application)
のように、型ごとにオーバーロードして対応する方法。
-------------------------------
→渡す型が限定できる場合は、冗長的ではあるがこれで対応できます。
→渡す型が限定できない場合は、(2),(3)の案で対応してみてください。
===============================
=====(2)=======================
メソッド定義を
Public Sub ReleaseInstance(ByRef Obj As Object)
と定義して利用する方法。
-------------------------------
→「Option Strict Off」のときは問題が出ないので、そのまま利用可能です。
→「Option Strict On」の場合、コンパイルエラー(BC32029)になるので、
Dim obj As Object = comObj
ReleaseInstance(obj)
If obj Is Nothing Then
comObj = Nothing
End If
のように、Object 型への変換が要求されます。
===============================
=====(3)=======================
メソッド定義を
Public Sub ReleaseInstance(ByVal Obj As Object)
と定義して利用する方法。
-------------------------------
→(2) とは異なり、Option Strict モードに依存せず、そのまま利用可能です。
→ただし、メソッド内での「Obj = Nothing」の行は無意味となります。
→Nothing 代入は、必要であれば呼び出し元で行わねばなりません。ただし、
COM オブジェクトの解放を意図しての作業であるのならば、Nothing 代入は
不要です。必要なのは、Marshal.ReleaseComObject だけなので。
===============================
ツイート | ![]() |