什么是非托管资源?

什么是非托管资源?

一些用户将打开的文件、数据库连接、分配的存储器、位图、文件流等排列在被管理的资源中,而另一些用户则在非被管理的资源中。那么它们是托管的还是非托管的?

我的观点是,响应更为复杂:当您在.NET中打开文件时,您可能会使用一些内置的.NET类System.IO.File、FileStream或其他东西。因为它是一个普通的.NET类,所以它是托管的。但真正打开文件的是一个包装器,它在内部做“肮脏的工作”(使用Win32 dlls与操作系统通信,调用低级函数甚至汇编指令)。这是.NET不知道的,非托管的。但您也许可以使用汇编指令自己打开该文件,并绕过.NET文件函数。则句柄和打开的文件是非托管资源。

DB也是一样的:如果你使用一些DB程序集,你会有像DbConnection这样的类,它们对.NET是已知的,并且是托管的。但它们包装了非托管的“脏工作”(在服务器上分配内存,与服务器建立连接,等等)。如果你不使用这个包装类,自己打开一些网络套接字,并使用一些命令与你自己陌生的数据库通信,那么它就是非托管的。

这些包装类(文件、DbConnection等)都是托管的,但它们内部使用非托管资源的方式与您一样,如果您不使用包装器并自己做“脏活”的话。因此,这些包装器确实实现了Dispose/Finalize模式。他们有责任允许程序员在不再需要包装器时释放非托管资源,并在包装器被垃圾回收时释放它们。包装器将被垃圾收集器正确地进行垃圾回收,但其中的非托管资源将通过使用Dispose/Finalize模式进行回收。

如果你不使用内置的.NET或第三方包装器类,并在你的类中通过汇编指令等打开文件,这些打开的文件是非托管的,你必须实现dispose/finalise模式。如果不这样做,即使你不再使用它(文件操作完成),甚至在你的应用程序终止之后,也会有内存泄漏,永久锁定的资源等。

但您的责任也是在使用这些包装器时。对于那些实现了dispose/finalise (您认识它们,即它们实现了IDisposable)的应用程序,还要实现您的dispose/finalise模式,甚至可以处理这些包装器,或者给它们发信号来释放它们的非托管资源。如果不这样做,资源将在一段无限期的时间后释放,但立即释放它是干净的(立即关闭文件,不要让它打开并随机阻塞几分钟/小时)。因此,在类的Dispose方法中,您将调用所有使用过的包装器的Dispose方法。

相关推荐

《學校2017》曝六人物介紹 個性鮮明引期待
365bet娱乐网

《學校2017》曝六人物介紹 個性鮮明引期待

📅 08-10 👁️ 3635
WPS怎么将多个文档合在一起#
365bet娱乐网

WPS怎么将多个文档合在一起#

📅 09-08 👁️ 7195
板绘学习路线、技巧和日常练习-----线条基础(点线面)---持续补充
365bet娱乐网

板绘学习路线、技巧和日常练习-----线条基础(点线面)---持续补充

📅 07-29 👁️ 9275