Vb.net 如何实现采用泛型参数的参数数组(参数的可变数量)的函数

Vb.net 如何实现采用泛型参数的参数数组(参数的可变数量)的函数,vb.net,generics,idisposable,paramarray,Vb.net,Generics,Idisposable,Paramarray,我在这里看到了一个例子,他们实现了一个通用的dispose方法,该方法接受任何IDisposable对象并对其调用dispose。我想这样做,它可以采取可变数量的参数。但是,我确实希望限制参数在编译时是IDisposable的。(这是因为我的组织中的一些人甚至会在不可识别的对象上调用此方法,“只是为了安全”和“不会造成伤害”) 我已经在VB中实现了同样的功能。我如何使它需要多个参数。请注意,我确实希望它们通过引用传递,因为我将变量设置为nothing Public Sub DisposeObje

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

我已经在VB中实现了同样的功能。我如何使它需要多个参数。请注意,我确实希望它们通过引用传递,因为我将变量设置为nothing

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

在VB中,您可以使用数组参数上的ParamArray修饰符获得一个参数数目可变的方法

但是请注意,ParamArray参数必须声明为ByVal,对数组的更改在调用代码中不起作用。因此,您不能同时拥有可变数量的参数和ByRef语义。

Donno VB,但在C中,您可以编写:

public void DisposeObjects(params IDisposable[] args)
{
  foreach(IDisposable obj in args)
  {
     if(obj != null)
     {
        obj.Dispose();
     }
  }
}
以下是您的操作方法:

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中#

在vb中:

Using obj As New TypeImlementingIdisposable
   ' do stuff with the object here
End Using
这确保了对象总是被释放,不管是否抛出异常

你可以在

用法:

按Foo=新Foo对任意对象进行调暗


DisposeObject(CType(any,Foo))

看起来像是有人在上面添加了VB.Net标记。我没有添加该标记,因为问题并非特定于VB.Net。C#中不存在同样的问题吗?。我将标记改为.Net。这是基于对接口、泛型、参数传递、IDisposable和垃圾收集器工作原理的基本误解。在一篇文章中,我想说的太多了,只是不要这样做。我仍在试图理解为什么Param不能与ByRef args一起工作。如果这太复杂,请让我知道,我将结束这个问题。那么,这是特定于Vb.Net的吗。我同意使用“using”是一种更好的方法,但目前我能对现有代码做的唯一更改是Finally块。我将在Finally块中调用此方法,这样即使在异常情况下,它们也会被释放。这样,我必须传入IDisposable变量,这意味着我必须将IDisposable变量分配给我想要释放的任何对象并传入。它让我在调用代码中将原始变量设置为nothing,这是不好的。
Using obj As New TypeImlementingIdisposable
   ' do stuff with the object here
End Using
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