我在查找表中有一堆IDisposable
个对象(简称旧的Dictionary<>,现在),但为了简化代码并避免错误,我正在寻找一个集合类“拥有“它所拥有的物品,并避免重新发明轮子 - 这样的课程是否已经存在?”
规范应该是:
- 收集必须是一次性的,当处理时,所有包含的物品也应该处理掉。
- 每当删除一个项目时,它都是Dispose()
- d。
- 理想情况下,集合是通用的,类型约束强制执行所包含类型的IDisposable
-
我怀疑这样一个类是否存在,但我对ReadOnlyCollection
和ObservableCollection
之前的存在感到惊喜......
基本上,我想要相当于C ++ STL容器,但后来又用于CLR; - )。
答案 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();
}
}
}