2010-07-18 7 views
9

Ich implementiere IDisposable für eine Klasse und beim Entsorgen gibt es eine interne Liste von Einwegobjekten. Sollte ich dieses Objekt durch Schleifen durchgehen?Wie eine Liste von Einwegobjekten zu entsorgen?

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

Das Schlüsselwort "Overloads" ist falsch, entfernen Sie es. Die VB.NET-IDE erzeugt für 99,9% aller IDisposable-Implementierungen einen unangemessenen Standardcode. Verschieben Sie den Entsorgungscode einfach in Sub Dispose() und entfernen Sie die geschützte Methode und SuppressFinalize. –

+0

@Hans, können Sie den Grund für Ihren Vorschlag angeben? – Joker

+0

Der Standardcode ist nur dann geeignet, wenn Sie einen Finalizer implementieren. Das ist extrem selten. –

Antwort

10

Ja, durchlaufen Sie die Liste und entsorgen Sie jedes Element.

Auch können Sie eine Erweiterungsmethode schreiben:

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 
      } 
    } 
} 

und nennen Sie es für Ihre Liste

_disposbaleObjects.Dispose() 
+0

Hat VB.Net Erweiterungsmethoden? –

+0

@Moron: Ja, es tut http://msdn.microsoft.com/en-us/library/bb384936.aspx – abatishchev

+0

+1 dann ..... :) –

2

Ja, Sie jedes dieser Objekte entsorgen müssen explizit, genau so, wie du bist mach es jetzt.

2

Wer erstellt die Objekte in der Liste? d. h. wer ist für ihren Lebenszyklus verantwortlich? Wenn MyDisposable sie erstellt, liegt es in ihrer Verantwortung, sie zu entsorgen. Wenn jemand anderes sie erstellt, kann die Entsorgung von ihnen einen Verweis auf ein nutzloses Objekt hinterlassen.

+0

MyDisposable erstellt die Liste der Objekte. – Joker