2010-07-18 17 views
9

我正在爲一個類實現IDisposable,同時處置一個可丟棄對象的內部列表。我應該通過循環來處理這些對象。如何處置一次性物品清單?

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

「Overloads」關鍵字錯誤,請將其刪除。 VB.NET IDE爲99.9%的所有IDisposable實現生成不合適的樣板代碼。只需將配置代碼移動到Sub Dispose()並擺脫受保護的方法和SuppressFinalize即可。 – 2010-07-18 17:53:58

+0

@Hans,你能說出你的建議的原因嗎? – Joker 2010-07-18 18:29:21

+0

只有在實現終結器時,樣板代碼才適用。這非常罕見。 – 2010-07-18 18:44:41

回答

10

是的,遍歷列表並處理每個項目。

你也可以寫一個擴展方法:

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

,並調用它爲您的列表

_disposbaleObjects.Dispose() 
+0

VB.Net有擴展方法嗎? – 2010-07-18 17:35:23

+0

@Moron:是的,它確實http://msdn.microsoft.com/en-us/library/bb384936.aspx – abatishchev 2010-07-18 17:39:30

+0

+1然後..... :) – 2010-07-18 17:54:20

2

是的,你需要明確處理這些對象,正是你的方式現在就做。

2

誰在列表中創建對象?即誰負責他們的生命週期?如果MyDisposable創建它們,那麼處置它們是它的責任。如果其他人創建它們,處理它們可以讓它們引用無用的對象。

+0

MyDisposable創建對象列表。 – Joker 2010-07-18 18:42:14