如何实现一个带有通用args的param数组(可变数量的args)的函数

时间:2010-08-31 11:17:08

标签: vb.net generics idisposable paramarray

我在这里看到question,他们实现了一个通用的dispose方法,该方法接受任何IDisposable对象并在其上调用dispose。我想这样做,它可以采取可变数量的args。但是,我确实希望在编译时将args限制为IDisposable。 (这是因为我组织中的某些人甚至会在非IDisposable对象上调用此方法“只是为了安全”和“它不会造成伤害”)

我在VB中实现了相同的功能。我怎么能让它采取多个args。请注意,我确实希望它们通过引用传递,因为我将变量设置为空。

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 个答案:

答案 0 :(得分:1)

在VB中,你会得到一个带有可变数量参数的方法,并在数组参数上使用ParamArray修饰符。

但请注意,ParamArray参数必须声明为ByVal,并且对数组的更改对调用代码没有影响。所以你不能同时拥有可变数量的参数和ByRef语义。

答案 1 :(得分:0)

Donno VB但在C#中你可以写:

public void DisposeObjects(params IDisposable[] args)
{
  foreach(IDisposable obj in args)
  {
     if(obj != null)
     {
        obj.Dispose();
     }
  }
}

答案 2 :(得分: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

但我不推荐这样的解决方案。使用“使用”语句要好得多。

在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

了解更多信息

答案 3 :(得分: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

用法:

Dim任意为Foo = New Foo

DisposeObjects(CType(any,Foo))