實現IDisposable接口的目的是什麼?我看到一些類實現它,我不明白爲什麼。實現IDisposable接口的目的是什麼?
回答
如果您的課程創建了非託管資源,那麼您可以實施IDisposable,以便在處理該對象時正確清理這些資源。你重寫Dispose並在那裏釋放它們。
當你的類使用了一些系統資源時,類是確保資源被釋放的責任。通過.Net設計,你應該在類的Dispose方法中做到這一點。 IDisposable接口標誌着您的類在不再使用時需要釋放資源,並且Dispose方法可用,以便您的類的用戶可以調用它來釋放所消耗的資源。
如果您希望自動清理功能正常工作並希望使用using()語句,那麼IDisposable方法也很重要。
這一切都與垃圾收集機制有關。 Chris Sells描述了垃圾收集,終結器以及處理模式(和IDisposable接口)episode 10 of .NET Rocks!(從大約34分鐘開始)的原因。
除了如果成功處置通常不需要進行最終確定之外,它對於gc機制並沒有什麼作用。非常脆弱的連接。 – 2012-08-07 10:50:15
除釋放非託管資源外,對象可以在超出範圍時有效執行某些操作。一個有用的例子可能是一個計時器對象:這些對象可以打印出自從構建Dispose()方法以來所經歷的時間。然後,這些對象可以用來記錄所採取的一些操作集合的大致時間:
3210這可以手動完成,當然,但我的感覺是一個人應該充分利用地方的編譯器的能力可能自動生成正確的代碼。
許多對象操縱其他實體的方式會導致問題,如果不清除。這些其他實體幾乎可以是任何東西,它們可能幾乎在任何地方。作爲一個例子,Socket對象可能會要求另一臺機器打開一個TCP連接。那臺機器可能無法一次處理很多連接;的確,它可能是一個只能處理一個連接的網絡設備。如果一個程序要打開一個套接字並忘記它,除非或直到套接字關閉(否則設備可能會在幾分鐘不活動之後關閉套接字本身,否則其他計算機將無法連接到該設備,但它在此之前是無用的)。
如果一個對象實現了IDisposable,這意味着它具有執行必要的清理操作所需的知識和動力,並且在丟失這些知識和動力之前需要執行這些操作。調用IDisposable.Dispose將確保執行所有這些清理操作,從而可以安全地放棄該對象。
Microsoft允許對象通過註冊一個名爲Finalize的方法來請求保護以免被放棄。如果一個對象這樣做,如果系統檢測到該對象已被放棄,則會調用Finalize方法。直到Finalize方法已經有機會運行,對象以及它擁有直接或間接引用的對象都不會從內存中刪除。這提供了某種「後退」的情況,以防對象被放棄而未被首先處置。然而,有很多陷阱,實現Finalize的對象,因爲不能保證它什麼時候會被調用。在Finalize被調用之前,不僅可以放棄一個對象很長一段時間,但如果一個人不小心,系統實際上可能會調用對象的Finalize,而其中一部分仍在使用中。危險的東西。正確使用Dispose要好得多。
- 1. 爲什麼System.Net.Mail.MailMessage實現IDisposable
- 2. Enumerable.Range爲什麼實現IDisposable?
- 3. 實現IDisposable接口和拋出異常時會發生什麼
- 4. 爲什麼Stream類實現IDisposable?
- 5. using關鍵字和IDisposable接口之間的關係是什麼?
- 6. 爲什麼IDisposable的實現設計方式是
- 7. 在C#中實現IDisposable的正確方法是什麼?
- 8. 爲什麼顯式的接口實現?
- 9. 爲什麼IDisposable是一個接口,而不是抽象類?
- 10. 實現IDisposable的C#
- 11. 爲什麼實現Serializable接口的類實現none接口的方法?
- 12. 如何在繼承自SocketAsyncEventArgs的類中實現IDisposable接口
- 13. 接口編程的目的是什麼?
- 14. OpenFirmware接口的目的是什麼?
- 15. 什麼是顯式接口成員實現,爲什麼
- 16. 實現了IDisposable
- 17. 爲什麼類會顯式而不是隱式地實現IDisposable?
- 18. 僅創建接口實例的目的是什麼?
- 19. java.nio.file.CopyOption接口的目標是什麼?
- 20. C++ 11:它的gc接口是什麼,以及如何實現?
- 21. 什麼是一個不需要實現的接口?
- 22. C#中顯式接口實現的優點是什麼?
- 23. 什麼接口是由一個類實現的?
- 24. 什麼是IAsyncResult接口的正確實現?
- 25. 實現java Collection接口的正確方法是什麼
- 26. 什麼是spring bean的bean ID實現了一個接口
- 27. 實現接口的方法是什麼也不做
- 28. C++中的接口與實現。這是什麼意思?
- 29. 接口暗示某種實現的好處是什麼?
- 30. C#中的IDisposable接口#
如果該類繼承保持未託管資源的託管對象(或保留其他受管對象......等等),還應實現它。沒有非託管資源需要清理,但是有一個`Dispose()`輪流調用Dispose(),這意味着非託管資源的最終持有者會被清理乾淨。 – 2012-08-07 13:55:31