我正在閱讀一些關於Dispose()
方法的文章,發現非託管資源應該從Dispose()
方法(或finalize()方法)明確釋放,文章中提到文件句柄和數據庫連接對象是非託管資源。任何人都可以解釋爲什麼這些是不受管理的,如果在Dispose()中處理不當,會發生什麼?我不知道文件句柄是什麼。它們在哪裏存在?非託管資源和Dispose()
回答
在這種情況下它可能是最容易想到的是這樣的:
非託管資源是你以Windows API調用返回一個
Windows Handle
必須在某個時刻被釋放獲得的任何資源。唯一的另一種資源是內存。如果它是由.Net分配的,則會自動進行管理。 (請注意,有辦法來分配使用Windows API內存;這算作一個非託管資源)
例如,FileStream
類調用Windows API來打開一個文件,其中FileStream
保持內部文件句柄。該文件句柄代表一個非託管資源,必須在某個時候釋放它。
FileStream
在幕後使用Windows API函數CreateFile()
。它是從CreateFile
返回的代表非託管資源的句柄。
如果不釋放這些句柄,他們將繼續分配給程序的持續時間,但有一個非託管資源的所有.NET類提供Finalizer
(見下文),以確保它們會通常可以在某個時間點釋放。
(但如果你正在寫自己的文件處理類,忘了釋放文件句柄的任何地方所有,直到你的程序退出文件將照常開放。)
通常這種非託管資源將在被釋放兩個的地方:
Dispose()方法。這應該是您處理非託管資源的正常方式。
The
Finalizer
。這是最後一招的機制。如果一個類有一個終結器,它將在垃圾收集器清理一個死對象時被調用。如果程序員忘記調用Dispose(),任何具有非託管資源的類都應該有一個終結器來清理。
這是一個簡化,但它會幫助你理解它,我希望。請參閱this MSDN article on the Dispose Pattern。
有些人認爲非託管資源與Windows API調用或其他類似的東西有關,但這是一個實現細節。非託管資源的基本特徵是其代表了外部實體的狀態的一個方面,該狀態爲了擁有資源的對象的利益而維護,潛在損害其他實體,以及外部實體將繼續維護 - 無用 - 如果所有對業主的引用都被放棄了。請注意,外部實體可以是任何地方的任何地方。 Windows API句柄代表了可能性的一小部分(獲取句柄的對象要求Windows使系統的某些方面可用於其獨佔使用,而不利於任何其他希望使用它們的代碼)。外部實體完全可能在同一個程序集內(尤其是資源是鎖定或事件訂閱),或者它可能位於另一個大陸(如果資源是遠程計算機上的文件)。
對象通過通知實體代表它的行爲來釋放資源,這些實體不再需要這樣做。託管資源是一個.NET堆對象,它可能擁有託管或非託管資源的某種組合,但如果資源被放棄,其資源可能會被釋放。
- 1. 什麼是託管資源和非託管資源?
- 2. 運行非託管資源
- 3. .Net中的託管和非託管資源
- 4. 非託管資源分配在哪裏
- 5. 以線程處理非託管資源
- 6. .NET中「託管」與「非託管」資源的含義是什麼?
- 7. COM包裝器:它們是託管還是非託管資源?
- 8. Unity遊戲對象是託管還是非託管資源?
- 9. 託管和非託管堆
- 10. 非託管資源,IDisposable接口和自定義類型
- 11. Grails 2.0,資源插件和根託管
- 12. C#類是否可以自動管理非託管資源
- 13. 託管和非託管C++和Boost
- 14. 在託管代碼中使用非託管dll中的資源字符串表
- 15. C++託管和非託管靜態庫
- 16. 非託管內存和託管存儲
- 17. 橋接非託管和託管類
- 18. 未發佈的資源:非託管對象
- 19. ToolStripMenuItem是否有任何底層的非託管資源?
- 20. System.Drawing中對象的非託管資源配置
- 21. C#如何查找非託管資源的類?
- 22. Google Gears在捕獲時掛起(非託管資源存儲)
- 23. Firebase託管網站可否包含非https資源?
- 24. 在一次性模式中什麼是「非託管資源」?
- 25. .NET應用程序崩潰,國家非託管資源的
- 26. 如何在表單關閉後處理非託管資源?
- 27. 清理會話中的非託管資源,如Crystal Report文檔
- 28. 如何以異步方式處理非託管資源?
- 29. 單元測試是否清理了非託管資源
- 30. 從SBT中的非託管資源過濾包