2010-07-09 76 views
3

通常我在using語句中聲明流,以確保在完成流時正確處理流,並且當我不在使用中時不會錯誤地調用它塊。c sharp中的流陣列

這裏的一些例子: MSDN using Statement Reference

一個人如何使用using語句流的陣列? 是否等同於在try/catch/finally塊之外聲明數組,並在finally塊中調用每個流的dispose方法?

最後,如何測試流是否已妥善處置?

+0

就像一個旁註...不要越過溪流! – 2010-07-09 18:15:24

回答

5

我會創建一個新的對象,其中包含流。像這樣的東西(不是完全突顯出來):

class StreamHolder : IDisposable 
{ 
    List<Stream> Streams {get;} 

    public void Dispose() 
    { 
     Streams.ForEach(x=>x.Dispose()): 
    } 
} 

這樣你就可以把容器對象在using statment,就會將處理流處理你。您的其他選擇是在Finally塊中處理它,但如果我要在多個位置執行此操作,我想封裝它,所以在完成操作後,我不會意外忘記處理所有流。

+2

這是好的,但它太具體。沒有理由不製作通過IEnumerable初始化的通用EnumerableDisposer。此時,您需要更改anon方法,以便通過'as'將其轉換爲IDisposable,並且如果不爲null,則調用Dispose。我在過去完成了這個工作,而且工作得很好。 – 2010-07-09 16:39:58

+0

這是一個好點。 – kemiller2002 2010-07-09 18:03:12

+0

謝謝大家。肯定需要檢查流的無效性,但這更符合我所尋找的解決方案。 – scott 2010-07-09 20:37:55

3

你必須做什麼using不使用using

這意味着循環訪問數組,並在每個實例上調用Dispose(如果需要,明確強制轉換爲IDisposable後)。在finally塊中執行該循環。

最後,你不測試它們被妥善處置。一旦你調用Dispose,你應該把它們清空,因爲你不能再使用它們了。

2

using()語句是旨在重新強化良好習慣的處置模式,但並非必需。有很多情況下需要在範圍函數的生命週期之外存儲對象。

雖然我認爲你應該可以使用using()語句來設計架構,但最重要的是,在某些終止塊中,你可以處理每個流。

要回答最後一個問題,Stream類沒有任何方法或屬性來確定它是否已關閉/處置,但是如果IDisposable模式正確實現,可以再次調用Close/Dispose if你需要確定。

+0

你說的對Dispose的額外調用應該是無害的,但沒有理由不在第一次調用之後清空引用,因爲調用任何其他方法都可能引發異常。總之,+1表示他改變它以允許'使用'。我之前完成了這個工作,使用了一個在IEnumerable上初始化的通用Disposer對象,並在其Dispose中將每個元素轉換爲IDisposable,以便(成功時)它可以調用Dispose。 – 2010-07-09 16:37:02