Как реализовать функцию, которая принимает массив параметров (переменное число аргументов) из универсальных аргументов - PullRequest
0 голосов
/ 31 августа 2010

Я видел вопрос , где они реализовали универсальный метод dispose, который принимает любой объект IDisposable и вызовы dispose для него.Я хотел бы сделать это так, чтобы он мог принимать переменное количество аргументов.Тем не менее, я хочу ограничить args быть 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 ]

1 голос
/ 31 августа 2010

В VB вы получаете метод с переменным числом аргументов с модификатором ParamArray для параметра массива.

Обратите внимание, что параметры ParamArray должны быть объявлены ByVal, и изменения в массиве не влияют на вызывающий код. Таким образом, вы не можете иметь как переменное количество аргументов, так и семантику ByRef.

0 голосов
/ 25 мая 2014
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 any as Foo = New Foo

DisposeObjects (CType (любой, Foo))

0 голосов
/ 31 августа 2010

Вот как вы это делаете:

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".

В с #

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

0 голосов
/ 31 августа 2010

Донно В.Б., но в C # вы можете написать:

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