繁体   English   中英

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

[英]What is meant by “managed” vs “unmanaged” resources in .NET?

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

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

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

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

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

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

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

在问答中什么是非托管资源? 1Bruce Wood发布了以下内容:

我这样想到“托管”和“非托管”这两个术语:

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

“非托管”是指.NET沙箱之外的荒野。 这包括通过调用Win32 API函数返回给您的任何内容。

如果您从未调用Win32 API函数并且永远不会返回任何Win32“句柄”对象,那么您不会持有任何非托管资源。 通过.NET Framework类方法打开的文件和流都是托管包装器。

注释:您可能不直接持有的非托管资源。 但是,您可能通过托管的“包装类”(如System.IO.FileStream) 间接持有非托管资源。 这样的包装类通常实现IDisposable (直接或通过继承)。

...许多托管(.NET Framework)对象都在其中包含非托管资源,您可能希望尽快Dispose(),或者至少为您的调用者提供这样做的机会。 这就是编写自己的Dispose()方法的地方。实际上,实现IDisposable()会为你做两件事:

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

  2. 允许您和您的呼叫者释放大量的.NET对象/ .NET对象,这些对象在您/您的呼叫者现在要释放的肮脏的小手中拥有宝贵的资源。

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


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

托管资源和非托管资源之间的基本区别在于垃圾收集器知道所有托管资源,在某个时间点GC将出现并清理与托管对象关联的所有内存和资源。 GC不知道非托管资源,例如文件,流和句柄,因此如果您不在代码中明确清除它们,那么最终会导致内存泄漏和锁定资源。

有关详细信息,请访问: http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM