VB.NET2003でOFのかわりをするのは?


ララ  2007-06-19 06:42:58  No: 143675

初めて質問します。環境は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が使えませんでした。何か、良い方法はありませんでしょうか。
よろしくお願いします


魔界の仮面弁士  2007-06-19 10:35:48  No: 143676

たとえば、
  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 だけなので。
===============================


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加