在.NET 中“托管”与“非托管”资源是什么意思?

在.NET 中,“托管资源”和“非托管资源”这两个术语是什么意思? 它们是如何出现在图片中的?

69528 次浏览

托管资源是那些纯粹的.NET 代码,由运行库管理,并由运行库直接控制的资源。

非托管资源是指那些不是。文件句柄、固定内存、 COM 对象、数据库连接等。

术语“非托管资源”通常用于描述某种 不直接在垃圾收集器的控制下。例如,如果打开到数据库服务器的连接,这将使用服务器上的资源(用于维护连接) ,如果提供程序不是完全用托管代码编写的,则可能使用客户机上的其他非 -.net 资源。

这就是为什么对于类似数据库连接的东西,建议您这样编写代码:

using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}

这样可以确保在连接对象上调用 .Dispose(),确保清除所有非托管资源。

托管资源和非托管资源之间的基本区别是 垃圾收集器在某个时间点知道所有托管资源 GC 会出现并清理所有相关的内存和资源 GC 不知道非托管资源,例如 作为文件、流和句柄,所以如果您没有在 那么您的代码最终将导致内存泄漏和资源锁定。

更多详情-http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources

托管资源是垃圾收集器可以释放的资源,而非托管资源不能被垃圾收集器释放,因此需要使用析构函数。

在问答 什么是非托管资源?1中,布鲁斯 · 伍德发布了以下内容:

我是这样看待“管理”和“非管理”这两个词的:

“ Managed” 指的是.NET 沙盒中的任何内容 所有.NETFramework 类。

“非托管” 指的是.NET 沙盒之外的荒野 包括通过调用 Win32API 返回给您的任何内容 功能。

如果您调用一个 Win32API 函数,并且 永远不会返回任何 Win32 “处理”对象,则不包含任何非托管资源。 通过.NETFramework 类方法打开的文件和流如下 所有的管理包装。

备注: 您可能没有持有非托管资源 直接。但是,您可能通过诸如 System.IO.FileStream之类的托管“包装器类”持有非托管资源 间接地。这样的包装类通常实现 一次性手机(直接或通过继承)。

... 许多托管(.NETFramework)对象是 在其中保存非托管资源,并且您可能希望 尽快处理掉他们,或者至少提供给你的来电者 有机会这样做。这就是写自己的处置() 本质上,实现 IDisposable ()做两件事 为你准备的东西:

  1. 允许您摆脱您直接从中获取的任何资源 . NET 背后的操作系统(非托管资源)。

  2. 允许您和您的调用方释放大量的.NET 对象/. NET 在他们肮脏的小地方拥有珍贵资源的物体 你/你的呼叫者想要释放的双手

备注: 通过实现 IDisposable,从而提供一个 Dispose()方法,您使您的类的用户能够以 确定性的方式释放您的类的实例所持有的任何非托管资源。


1 链接最初在 Sachin Shanbhag 的回答分享。引用材料日期为2005-11-17。注意,我已经轻微地编辑了引用内容。