如何处理一组可处理对象列表?

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。 - Hans Passant
@Hans,请问你能说明你建议的原因吗? - user394307
1
样板代码仅在实现终结器时才是适当的。这种情况非常罕见。 - Hans Passant
3个回答

18

是的,遍历列表并处理每个项。

此外,您可以编写扩展方法:

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

并将其用于您的列表

coll.Dispose()

一次性集合,即实现了IDisposable接口的集合:

public sealed class DisposableCollection<T> : Collection<T>, IDisposable
    where T : IDisposable
{
    public DisposableCollection(IList<T> items)
        : base(items)
    {
    }

    public void Dispose()
    {
        foreach (var item in this)
        {
            try
            {
                item.Dispose();
            }
            catch
            {
                // swallow
            }
        }
    }
}

使用方法:

using (var coll = new DisposableCollection(items))
{
     // use
}
// it has been disposed


VB.Net有扩展方法吗? - Aryabhatta
1
+1或者你可以继承List来定义一个自动完成这个任务的对象?http://willsmentaldebris.blogspot.com/2007/08/disposable-container-class.html - MarkJ
类似Clear()和Remove()这样的方法怎么办?它们应该被重写,考虑到可释放对象是由集合所拥有的事实。 - ivan.ukr

3

谁创建列表内的对象?也就是说,谁负责它们的生命周期?如果是MyDisposable创建它们,那么它有责任对它们进行处理。如果是其他人创建它们,处理这些对象可能会让它们引用无用的对象。


MyDisposable 创建了对象列表。 - user394307

1

是的,你需要明确地释放每个对象,就像你现在正在做的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接