2010-07-18 47 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