2010-07-18 3 views
9

J'implémente IDisposable pour une classe et je dispose d'une liste interne d'objets jetables. Dois-je disposer ces objets en les bouclant.Comment disposer d'une liste d'objets jetables?

public Class MyDisposable 
    Implements IDisposable 
    private _disposbaleObjects as new List(of OtherDisposables) 

    Public Overloads Sub Dispose() Implements System.IDisposable.Dispose 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 

    Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
        ? Should I dispose the the list like this ? 
        For Each obj In _disposbaleObjects 
         obj.dispose() 
        Next 
      End If    
     End If 
     Me.disposedValue = True 
    End Sub 

End Class 
+2

Le mot clé "Surcharge" est incorrect, supprimez-le. L'IDE VB.NET génère un code standard inapproprié pour 99,9% de toutes les implémentations IDisposable. Déplacez simplement le code de disposition à Sub Dispose() et débarrassez-vous de la méthode protégée et de SuppressFinalize. –

+0

@Hans, Pouvez-vous indiquer la raison de votre suggestion? – Joker

+0

Le code standard est approprié uniquement lorsque vous implémentez un finaliseur. C'est extrêmement rare. –

Répondre

10

Oui, parcourez la liste et éliminez chaque élément.

Aussi, vous pouvez écrire une méthode d'extension:

public static void Dispose(this IEnumerable<IDisposable> collection) 
{ 
    foreach (IDisposable item in collection) 
    { 
     if (item != null) 
     { 
      try 
      { 
       item.Dispose(); 
      } 
      catch (Exception) 
      { 
       // log exception and continue 
      } 
    } 
} 

et l'appeler pour votre liste

_disposbaleObjects.Dispose() 
+0

Est-ce que VB.Net a des méthodes d'extension? –

+0

@Moron: Oui, il le fait http://msdn.microsoft.com/en-us/library/bb384936.aspx – abatishchev

+0

+1 alors ..... :) –

2

Oui, vous devez disposer chacun de ces objets explicitement, exactement comme vous êtes faire maintenant.

2

Qui crée les objets dans la liste? c'est-à-dire qui est responsable de leur cycle de vie? Si MyDisposable les crée, il est de sa responsabilité d'en disposer. Si quelqu'un d'autre les crée, les disposer peut les laisser avec une référence à un objet inutile.

+0

MyDisposable crée la liste des objets. – Joker