在.NET 中,“托管资源”和“非托管资源”这两个术语是什么意思? 它们是如何出现在图片中的?
托管资源是那些纯粹的.NET 代码,由运行库管理,并由运行库直接控制的资源。
非托管资源是指那些不是。文件句柄、固定内存、 COM 对象、数据库连接等。
术语“非托管资源”通常用于描述某种 不直接在垃圾收集器的控制下。例如,如果打开到数据库服务器的连接,这将使用服务器上的资源(用于维护连接) ,如果提供程序不是完全用托管代码编写的,则可能使用客户机上的其他非 -.net 资源。
这就是为什么对于类似数据库连接的东西,建议您这样编写代码:
using (var connection = new SqlConnection("connection_string_here")) { // Code to use connection here }
这样可以确保在连接对象上调用 .Dispose(),确保清除所有非托管资源。
.Dispose()
托管资源和非托管资源之间的基本区别是 垃圾收集器在某个时间点知道所有托管资源 GC 会出现并清理所有相关的内存和资源 GC 不知道非托管资源,例如 作为文件、流和句柄,所以如果您没有在 那么您的代码最终将导致内存泄漏和资源锁定。
更多详情-http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources
托管资源是垃圾收集器可以释放的资源,而非托管资源不能被垃圾收集器释放,因此需要使用析构函数。
在问答 什么是非托管资源?1中,布鲁斯 · 伍德发布了以下内容:
我是这样看待“管理”和“非管理”这两个词的: “ Managed” 指的是.NET 沙盒中的任何内容 所有.NETFramework 类。 “非托管” 指的是.NET 沙盒之外的荒野 包括通过调用 Win32API 返回给您的任何内容 功能。 如果您调用一个 Win32API 函数,并且 永远不会返回任何 Win32 “处理”对象,则不包含任何非托管资源。 通过.NETFramework 类方法打开的文件和流如下 所有的管理包装。
我是这样看待“管理”和“非管理”这两个词的:
“ Managed” 指的是.NET 沙盒中的任何内容 所有.NETFramework 类。
“非托管” 指的是.NET 沙盒之外的荒野 包括通过调用 Win32API 返回给您的任何内容 功能。
如果您调用一个 Win32API 函数,并且 永远不会返回任何 Win32 “处理”对象,则不包含任何非托管资源。 通过.NETFramework 类方法打开的文件和流如下 所有的管理包装。
备注: 您可能没有持有非托管资源 直接。但是,您可能通过诸如 System.IO.FileStream之类的托管“包装器类”持有非托管资源 间接地。这样的包装类通常实现 一次性手机(直接或通过继承)。
... 许多托管(.NETFramework)对象是 在其中保存非托管资源,并且您可能希望 尽快处理掉他们,或者至少提供给你的来电者 有机会这样做。这就是写自己的处置() 本质上,实现 IDisposable ()做两件事 为你准备的东西: 允许您摆脱您直接从中获取的任何资源 . NET 背后的操作系统(非托管资源)。 允许您和您的调用方释放大量的.NET 对象/. NET 在他们肮脏的小地方拥有珍贵资源的物体 你/你的呼叫者想要释放的双手
... 许多托管(.NETFramework)对象是 在其中保存非托管资源,并且您可能希望 尽快处理掉他们,或者至少提供给你的来电者 有机会这样做。这就是写自己的处置() 本质上,实现 IDisposable ()做两件事 为你准备的东西:
允许您摆脱您直接从中获取的任何资源 . NET 背后的操作系统(非托管资源)。
允许您和您的调用方释放大量的.NET 对象/. NET 在他们肮脏的小地方拥有珍贵资源的物体 你/你的呼叫者想要释放的双手
备注: 通过实现 IDisposable,从而提供一个 Dispose()方法,您使您的类的用户能够以 确定性的方式释放您的类的实例所持有的任何非托管资源。
IDisposable
Dispose()
1 链接最初在 Sachin Shanbhag 的回答分享。引用材料日期为2005-11-17。注意,我已经轻微地编辑了引用内容。