2009-07-20 57 views
7

我在查找表中有一堆IDisposable對象(現在普通的舊字典<>),但爲了簡化代碼並避免錯誤,我在尋找一個集合類,它「擁有「它所擁有的物品,並避免重新發明輪子 - 這樣的班級是否已經存在?IDisposable對象的標準集合

的規範應該是: - 收集必須是一次性的,它被設置在所有包含的項目也應該被配置。 - 每當一個項目被刪除時,它首先是Dispose() -d。 - 理想,收集將是通用與類型約束強制執行IDisposable -ness所包含的類型。

我八九不離十懷疑這樣一類存在,但我已經通過ReadOnlyCollectionObservableCollection之前存在感到驚喜......

從本質上講,我想在C++ STL容器的等價但後來CLR ;-)。

+0

它已經一小會兒。你做了一個IDisposableCollection嗎?我也可以使用它。 – JohnV 2010-10-27 01:06:23

+0

不;我最終包裝了這個集合,並暴露了我實際需要的(非常)很少的方法 - 添加/獲取/刪除 - 以及針對我工作的特定事物(大量文件系統觀察者)的一些額外功能。 – 2010-10-27 09:59:59

回答

1

您正在尋找CompositeDisposable

using System.Reactive.Disposables; 

    ... 

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

我看你問什麼,但有多難,使該處置後才能取出元素自己remove方法?

+0

根本不難 - 但如果可能的話,它會更清潔。 而且,這不僅僅是刪除,正確的 - 任何可能覆蓋元素的方法都會隱式替換現有的元素,這也需要Dispose()。如果你的集合實現了一些標準接口,那麼這些remove/setter函數可能會有很多變體,導致代碼膨脹。 – 2009-07-20 14:51:47

2

據我所知,有的只是退出等集合IComponents - Container implements IContainer。對於通用IDisposable我想你沒有其他選擇,但「重新發明輪子」。

+0

謝謝,我會研究它(儘管它看起來有點沉重 - API有一堆我不會用的東西 - 這可能沒關係)! – 2009-07-20 14:53:53

+0

Container和System.ComponentModel似乎過於複雜且不夠靈活,無法用於一般用途。總之,我接受你的回答,我除了「重新發明輪子」之外沒有別的選擇。 – 2009-07-24 11:52:22

1

請記住,您的集合可能不是唯一包含一次性對象的集合... 如果另一個對象(集合外部)引用其中一個對象,該怎麼辦?如果在集合處置時處置它,那麼對象會發生什麼?

如果這些對象實現IDisposable對於一些非託管資源清理然後確保他們實現最終確定以及和非託管資源的處置存在。

+0

我目前完全控制對象和集合 - 所以這是一個假設情況。任何狀況之下;這就是事情與IDisposables一起工作的方式,對吧?我的意思是,*某人*必須擁有(即最終處置)它們,並且在這種情況下,擁有者恰好擁有可變數量的IDisposables,因此集合將是最簡單的。 – 2009-07-20 14:49:22

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(); 
     } 
    } 
}