2010-07-18 29 views
9

Estoy implementando IDisposable para una clase y mientras deseche hay una lista interna de objetos desechables. ¿Debo deshacerme de esos objetos haciendo un bucle a través de ellos?¿Cómo disponer una lista de objetos desechables?

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

La palabra clave "Sobrecargas" es incorrecta, elimínela. El IDE de VB.NET genera un código repetitivo inapropiado para el 99.9% de todas las implementaciones IDisposable. Simplemente mueva el código de eliminación a Sub Dispose() y elimine el método protegido y SuppressFinalize. –

+0

@ Hans, ¿Puedes decirnos el motivo de tu sugerencia? – Joker

+0

El código estándar es apropiado solo cuando implementa un finalizador. Eso es extremadamente raro. –

Respuesta

10

Sí, repita la lista y deseche cada elemento.

También puede escribir un método de extensión:

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

y llamarlo para su lista

_disposbaleObjects.Dispose() 
+0

¿VB.Net tiene métodos de extensión? –

+0

@Moron: Sí, lo hace http://msdn.microsoft.com/en-us/library/bb384936.aspx – abatishchev

+0

+1 luego ..... :) –

2

Sí, es necesario disponer cada uno de estos objetos de forma explícita, exactamente de la manera que eres haciéndolo ahora.

2

¿Quién crea los objetos dentro de la lista? es decir, ¿quién es responsable de su ciclo de vida? Si MyDisposable los crea, entonces es su responsabilidad deshacerse de ellos. Si alguien más los crea, deshacerse de ellos puede dejarlos con una referencia a un objeto inútil.

+0

MyDisposable crea la lista de objetos. – Joker

Cuestiones relacionadas