0

IDisposable オブジェクトを取り、それに対して dispose を呼び出すジェネリックな dispose メソッドを実装した質問をここで見ました。これを可変数の引数を取ることができるようにしたいと思います。ただし、コンパイル時に引数を IDisposable に制限したいと思います。(これは、私の組織の一部の人々が、IDisposable 以外のオブジェクトに対してもこのメソッドを呼び出すことになるためです。「安全のために」「害はありません」)

私はこのようにVBで同じことを実装しました。複数の引数を取るにはどうすればよいですか。変数を何も設定していないため、それらを参照渡ししたいことに注意してください。

Public Sub DisposeObject(Of TDisposable As IDisposable)(ByRef disposableObject As TDisposable)
    If disposableObject IsNot Nothing Then
        disposableObject.Dispose()
        disposableObject = Nothing
    End If
End Sub
4

4 に答える 4

1

VB では、配列パラメーターに ParamArray 修飾子を使用して、可変数の引数を持つメソッドを取得します。

ただし、ParamArray パラメーターは ByVal として宣言する必要があり、配列を変更しても呼び出し元のコードには影響しないことに注意してください。したがって、可変数の引数と ByRef セマンティクスの両方を持つことはできません。

于 2010-08-31T12:05:51.917 に答える
0

Donno VB ですが、C# では次のように記述できます。

public void DisposeObjects(params IDisposable[] args)
{
  foreach(IDisposable obj in args)
  {
     if(obj != null)
     {
        obj.Dispose();
     }
  }
}
于 2010-08-31T12:11:04.090 に答える
0
Public Sub DisposeObjects(Of T As IDisposable)(ByRef disposableObject As T)
    Dim disposable As IDisposable = CType(disposableObject, T)
    disposableObject = CType(Nothing, T)
    If (disposable IsNot Nothing) Then
        disposable.Dispose()
    End If
End Sub

使用法:

Foo = New Foo としていずれかを薄暗くする

DisposeObjects(CType(any, Foo))

于 2014-05-25T12:42:41.047 に答える
0

方法は次のとおりです。

Public Sub DisposeObject(ByVal ParamArray disposableObjects() As IDisposable)
    For Each obj As IDisposable In disposableObjects
        If Not IsNothing(obj) Then obj.Dispose()
    Next
End Sub

しかし、私はそのような解決策をお勧めしません。「using」ステートメントを使用する方がはるかに優れています。

C#で

using (var obj = new TypeImlementingIdisposable)
{
   //do stuff with the object here
}

そしてvbで:

Using obj As New TypeImlementingIdisposable
   ' do stuff with the object here
End Using

これにより、例外がスローされるかどうかに関係なく、オブジェクトが常に破棄されることが保証されます。

msdnで詳細を読むことができます

于 2010-08-31T12:41:21.630 に答える