12

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

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

我有点怀疑这样的课程是否存在,但我对之前的存在感到ReadOnlyCollection惊喜ObservableCollection......

本质上,我想要 C++ STL 容器的等价物,然后是 CLR ;-)。

4

5 回答 5

8

您正在寻找CompositeDisposable

    using System.Reactive.Disposables;

    ...

    CompositeDisposable xs = new CompositeDisposable(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Add(Disposable.Empty);
    xs.Dispose();
于 2017-06-28T15:25:50.203 回答
2

据我所知,只有 IComponents 的此类集合存在 - Container implements IContainer。对于通用 IDisposable,我认为您别无选择,只能“重新发明轮子”。

于 2009-07-20T14:06:19.430 回答
1

请记住,您的集合可能不是唯一包含一次性对象的集合......如果另一个对象(集合外部)正在引用其中一个对象怎么办?如果在处置集合时处置它,那么对象会发生什么?

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

于 2009-07-20T14:22:50.280 回答
1

像这样的东西怎么样:

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();
        }
    }
}
于 2017-10-15T00:44:50.910 回答
0

我明白你在问什么,但是在你删除它之前制作你自己的删除方法来处理元素有多难?

于 2009-07-20T14:01:14.583 回答