2009-08-31 40 views
5

如果我使用IDisposable實現一個對象,那麼即使它們沒有其他資源要釋放,擁有該對象的所有對象是否也應該實現它?IDisposable鏈

回答

12

是的。你需要處理它們,以便讓你的成員變量得到正確的處理。

任何時候你封裝一個IDisposable類,你應該讓你的類IDisposable。在你的Dispose方法中,你應該處理你的封裝資源。基本上,對待它們的方式與對待本機資源的方式相同。

+0

只有你不能假設的順序如果由GC終結器線程引發,則會釋放對象。 –

+0

確實 - 但我不確定這是如何相關的。如果你包裝你的課程並使其一次性完成,你可以控制每個封裝資源的處理順序。 –

1

如果需要確定性處置,最終某些客戶端需要調用Dispose或將調用包裝在「使用」塊中。爲了向您的對象滴流,這可能需要擁有者實現IDisposable。

您不應該依賴垃圾收集器來釋放任何時間相關的資源。

+0

這不是一個非託管資源問題。擁有非託管資源的對象將使用'SafeHandle'或2)使用用戶定義的終結器來釋放非託管資源。雖然這是非確定性的,但垃圾收集器*能夠正確釋放未經處理的資源。適當的「IDisposable」鏈的主要好處是及時「關閉」,「結束」或「釋放」對這個問題敏感的資源,例如(但絕對不限於)I/O。 –

+0

已注意。謝謝。 –

1

是的,擁有類應該實現IDisposable,但它不需要(不應該有)Finalizer(析構函數)。

1

NOP,他們只需要使用類與「使用」的聲明,以確保他們妥善處理該對象,但這些對象本身並不需要實現IDisplosable

+0

如果另一個類擁有一次性對象,它也應該實現IDisposable。否則,擁有類沒有辦法允許呼叫者處理它,並因此無法處理它擁有的內部可支配資源。 –

+0

它只是取決於類如何在內部使用對象 – BlackTigerX

+0

我特別使用「own」這個詞來表示「有一個指定類型的成員變量」,所以不能這樣做。我使用「正在使用」的工作來說明你正在談論的內容。 –