2010-10-31 100 views
4

什麼是非託管對象?你可以用CLR來解釋一下嗎?我在互聯網上了解到,他們說非託管對象不能在CLR環境下運行。你能給我一個非託管對象的例子嗎?什麼是非託管對象?

+3

「我在互聯網上學到了」 – 2010-10-31 07:05:37

+1

很差的英語.... :)對不起 – NoviceToDotNet 2010-11-01 04:37:20

回答

7

任何未由CLR內存管理(即垃圾回收器)管理的內存都是非託管內存。

OS文件句柄是非託管內存的一個示例(在.NET和Windows下)。

要妥善處置非託管資源 ,建議您 實現公共的Dispose或執行該對象的必要 清理代碼關閉 方法。 IDisposable接口爲實現接口的資源類 提供 Dispose方法。由於 它是公開的,因此您的 應用程序的用戶可以直接調用Dispose 方法來釋放由非託管資源使用的內存。當您正確執行 實施Dispose方法時, Finalize方法成爲 在 未調用Dispose方法的情況下清理資源的安全措施。

編號:Cleaning Up Unmanaged Resources

5

簡單地說,非託管的對象是不是由.NET框架管理的對象。

最好的例子是數據庫連接或文件操作最終由操作系統處理,並且需要明確解放(File.Close()或Connection close)並且不會由垃圾收集器自動處理。

+1

IT意味着非託管資源arre存儲在堆棧中..我也混淆了堆棧和堆..我瞭解到,對象存儲在堆和GC照顧堆中未使用的對象並清理 – NoviceToDotNet 2010-10-31 06:29:18

+0

這不是堆和堆棧問題。這意味着,這不是.net框架(和本例中的GC)處理其從記憶中解放的責任。 – Zied 2010-10-31 06:40:49

1
I learned on the internet that they say unmanaged objects don't run under the CLR environment. 

這是不對的,在CLR是非常能夠什麼可以做到的範圍內C.一切在C#中你有一個叫不安全keywoard,它允許您訪問甚至指針和指針發生偏移。我有一個項目,我使用遊戲引擎進行繁重的Interop工作,而C封裝非常小,因爲我可以處理CLR/C#中的所有內存對象。

通過不是運行它們可能希望明確清楚未虛擬化的對象不是由虛擬機處理的:您必須執行清理或創建包裝類來爲您清理。

2

您的應用程序或網站日常使用的VC++ 6.0示例或許多activeX和COM對象是非託管的,例如Excel VBA是非託管的,並且有太多其他示例。