.NET中“托管”与“非托管”资源的含义是什么?

时间:2010-08-31 08:15:15

标签: .net unmanaged managed

.NET中托管资源和非托管资源的含义是什么意思?他们是如何进入画面的?

5 个答案:

答案 0 :(得分:63)

术语“非托管资源”通常用于描述不直接受垃圾收集器控制的内容。例如,如果打开与数据库服务器的连接,则将使用服务器上的资源(用于维护连接)以及客户端计算机上的其他非.NET资源(如果提供程序不是完全使用托管代码编写的话)。

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

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

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

答案 1 :(得分:28)

托管资源是那些纯.NET代码并由运行时管理并受其直接控制的资源。

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

答案 2 :(得分:9)

在Q& A What are unmanaged resources? 1 中, Bruce Wood 发布了以下内容:

  

我想到的条款"托管"和#34;非管理"这样:

     

"托管" 是指.NET沙箱中的任何内容。这包括   所有.NET Framework类。

     

" Unmanaged" 指的是.NET沙箱之外的荒野。这个   包括通过调用Win32 API返回给您的任何内容   功能

     

如果从不调用Win32 API函数,从不取回任何Win32   "处理"对象,那么你没有持有任何非托管资源。   通过.NET Framework类方法打开的文件和流是   所有托管包装。

评论:您可能没有直接持有非托管资源 。但是,您可能通过托管的#34;包装类"来间接持有非托管资源间接。例如System.IO.FileStream。这样的包装类通常实现IDisposable(直接或通过继承)。

  

...许多托管(.NET Framework)对象都是   在他们内部持有非托管资源,你可能想要   尽快处理它们,或者至少为你的呼叫者提供服务   有机会这样做。编写自己的Dispose()的地方   方法来了。实质上,实现IDisposable()会做两个   适合你的事情:

     
      
  1. 允许您删除直接从中获取的所有资源   .NET背后的操作系统(非托管资源)。

  2.   
  3. 允许您和您的调用者释放大量的.NET对象/ .NET   那些在他们肮脏的小宝贝中拥有宝贵资源的物品   您/您的呼叫者想要发布的牌现在

  4.   

评论:通过实施IDisposable从而提供Dispose()方法,您可以让您的班级用户在确定性中发布塑造您的班级实例持有的任何非托管资源。

1 最初在Sachin Shanbhag's answer中分享的链接。引用的材料日期为2005-11-17。请注意,我对引用的内容进行了轻微的复制编辑。

答案 3 :(得分:5)

托管和非托管资源之间的基本区别在于 垃圾收集器在某个时间点知道所有托管资源 GC将出现并清理所有相关的内存和资源 使用托管对象。 GC不知道非托管资源 作为文件,流和句柄,所以如果你没有明确地清理它们 你的代码然后你将最终导致内存泄漏和锁定的资源。

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

答案 4 :(得分:0)

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