2014-02-13 51 views
1

我的問題是特定於,爲什麼和不在哪裏實現IDisposable接口。哪裏不使用IDisposable實現?

如果我不使用&消耗任何非託管資源,仍然是實施IDisposable接口的良好做法。

如果我這樣做有什麼優點或缺點?還是實施它的好習慣?

請指教。

+0

http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface,相當不錯的答案就在這裏。可能重複。 – Mohanavel

回答

1

你兩個原因一個實施IDisposable

  1. 如果有非託管資源自由。
    您這樣做是因爲這是GC知道如何釋放非託管資源的唯一方式,否則它不知道。 這是關於什麼資源免費。這種情況實際上非常罕見 - 通常情況下,您通過現有的託管對象訪問非託管資源。這種情況需要完整的「官方建議」實施。一般而言,您應該將非託管資源包裝在自己的獨立(託管)類中,該類將執行IDisposable implimentation(而不是在其他較大的對象中包含非託管資源)。

  2. 如果你的類包含暗示IDisposable的對象。
    你這樣做並不是因爲如果你沒有(他們會),那些對象就不會自由,而是因爲你希望能夠控制何時釋放這些資源。具有處理一類一次性成員的處置意味着消費者可以應用using陳述來輕鬆控制WHEN資源被釋放。在實踐中,這通常是實現IDisposable的主要原因。請注意,如果你的類是密封的,你可以逃脫一mimimal IDisposable的實施在這裏 - 也就是,只有處置 - 沒有建議需要完全成熟的「官方」 implimenation

因此,如果沒有這些

+0

第三個原因是,如果返回類型的工廠方法有時可能會生成需要清理的資源的派生類型實例。這就是爲什麼'IEnumerator '實現'IDisposable',爲什麼非泛型'IEnumerator'應該有但沒有。 – supercat

0

如果一個類實現了IDisposable,那麼通常會賦予創建該類實例的任何代碼,以確保Dispose在該實例被放棄之前被調用;它可以實現當責任不再需要時,通過在對象本身上調用Dispose,或者通過確保其他某些接收參考文獻的對象接受「所有權」並對其負責。在大多數情況下,當代碼被正確寫入時,每個Dispose尚未被調用的對象將在每個時間點恰好具有一個「擁有」它的實體(對象或執行範圍)。在IDisposable對象的生命週期中,所有權可能會在不同的實體之間傳遞,但是當一個對象獲得所有權時,前一個對象應該放棄它。

在許多情況下,對象將以這種方式使用,追蹤所有權並不困難。通常情況下,任何狀態將被修改的對象應該只有一個所有者,並且所有者將知道何時不再需要該對象。此外,由於所有權對象狀態的修改將構成對所有者狀態的修改,所有者本身應該擁有一個所有者。在這種情況下,要求店主致電Dispose不會有任何困難(店主的店主應該致電Dispose)。然而,這個原則存在一個「陷阱」:一個對象可能創建一個可變類的實例,但不能改變它,也不允許任何其他人這樣做。如果所討論的可變類簡單地保存值並且不實現IDisposable,那麼持有對永遠不會實際變異的事物的引用的對象不必關心所有權。這可以允許一些主要的簡化,因爲許多對象可能持有對不變對象的引用並且不必擔心它們中的哪些將最後使用它。但是,如果所討論的可變類實現IDisposable,則不再可能進行這種簡化。