2009-01-18 64 views

回答

9

如果您的課程創建了非託管資源,那麼您可以實施IDisposable,以便在處理該對象時正確清理這些資源。你重寫Dispose並在那裏釋放它們。

+0

如果該類繼承保持未託管資源的託管對象(或保留其他受管對象......等等),還應實現它。沒有非託管資源需要清理,但是有一個`Dispose()`輪流調用Dispose(),這意味着非託管資源的最終持有者會被清理乾淨。 – 2012-08-07 13:55:31

5

當你的類使用了一些系統資源時,類是確保資源被釋放的責任。通過.Net設計,你應該在類的Dispose方法中做到這一點。 IDisposable接口標誌着您的類在不再使用時需要釋放資源,並且Dispose方法可用,以便您的類的用戶可以調用它來釋放所消耗的資源。

如果您希望自動清理功能正常工作並希望使用using()語句,那麼IDisposable方法也很重要。

2

這一切都與垃圾收集機制有關。 Chris Sells描述了垃圾收集,終結器以及處理模式(和IDisposable接口)episode 10 of .NET Rocks!(從大約34分鐘開始)的原因。

+0

除了如果成功處置通常不需要進行最終確定之外,它對於gc機制並沒有什麼作用。非常脆弱的連接。 – 2012-08-07 10:50:15

3

除釋放非託管資源外,對象可以在超出範圍時有效執行某些操作。一個有用的例子可能是一個計時器對象:這些對象可以打印出自從構建Dispose()方法以來所經歷的時間。然後,這些對象可以用來記錄所採取的一些操作集合的大致時間:

​​3210

這可以手動完成,當然,但我的感覺是一個人應該充分利用地方的編譯器的能力可能自動生成正確的代碼。

1

許多對象操縱其他實體的方式會導致問題,如果不清除。這些其他實體幾乎可以是任何東西,它們可能幾乎在任何地方。作爲一個例子,Socket對象可能會要求另一臺機器打開一個TCP連接。那臺機器可能無法一次處理很多連接;的確,它可能是一個只能處理一個連接的網絡設備。如果一個程序要打開一個套接字並忘記它,除非或直到套接字關閉(否則設備可能會在幾分鐘不活動之後關閉套接字本身,否則其他計算機將無法連接到該設備,但它在此之前是無用的)。

如果一個對象實現了IDisposable,這意味着它具有執行必要的清理操作所需的知識和動力,並且在丟失這些知識和動力之前需要執行這些操作。調用IDisposable.Dispose將確保執行所有這些清理操作,從而可以安全地放棄該對象。

Microsoft允許對象通過註冊一個名爲Finalize的方法來請求保護以免被放棄。如果一個對象這樣做,如果系統檢測到該對象已被放棄,則會調用Finalize方法。直到Finalize方法已經有機會運行,對象以及它擁有直接或間接引用的對象都不會從內存中刪除。這提供了某種「後退」的情況,以防對象被放棄而未被首先處置。然而,有很多陷阱,實現Finalize的對象,因爲不能保證它什麼時候會被調用。在Finalize被調用之前,不僅可以放棄一個對象很長一段時間,但如果一個人不小心,系統實際上可能會調用對象的Finalize,而其中一部分仍在使用中。危險的東西。正確使用Dispose要好得多。

相關問題