IDisposable对象的标准集合

时间:2009-07-20 13:52:26

标签: .net collections idisposable

我在查找表中有一堆IDisposable个对象(简称旧的Dictionary<>,现在),但为了简化代码并避免错误,我正在寻找一个集合类“拥有“它所拥有的物品,并避免重新发明轮子 - 这样的课程是否已经存在?”

规范应该是:   - 收集必须是一次性的,当处理时,所有包含的物品也应该处理掉。   - 每当删除一个项目时,它都是Dispose() - d。   - 理想情况下,集合是通用的,类型约束强制执行所包含类型的IDisposable -

我怀疑这样一个类是否存在,但我对ReadOnlyCollectionObservableCollection之前的存在感到惊喜......

基本上,我想要相当于C ++ STL容器,但后来又用于CLR; - )。

5 个答案:

答案 0 :(得分:2)

据我所知,IComponents只有退出这样的集合 - Container implements IContainer。对于通用的IDisposable,我认为除了“重新发明轮子”之外没有其他选择。

答案 1 :(得分:2)

您正在寻找CompositeDisposable

    using System.Reactive.Disposables;

    ...

    CompositeDisposable xs = new CompositeDisposable(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Dispose();

答案 2 :(得分:1)

请记住,您的收藏可能不是唯一包含一次性物品的收藏品...... 如果另一个对象(集合外部)引用其中一个,该怎么办?如果在处理集合时将其丢弃,那么对象会发生什么?

如果这些对象为某些非托管资源清理实现IDisposable,那么请确保它们也实现了最终化并在那里处理非托管资源。

答案 3 :(得分:0)

我看到你在问什么,但在删除元素之前制作自己的删除方法有多难?

答案 4 :(得分:0)

这样的事情怎么样:

public class DisposableEnumerable<T> : IEnumerable<T>, IDisposable where T : IDisposable
{
    IEnumerable<T> Enumerable { get; }

    public DisposableEnumerable(IEnumerable<T> enumerable)
    {
        Enumerable = enumerable;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return Enumerable.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return Enumerable.GetEnumerator();
    }

    public void Dispose()
    {
        foreach(var disposable in Enumerable)
        {
            disposable.Dispose();
        }
    }
}