在 .NET 中,什么是托管资源和非托管资源?它们是如何出现的?
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
这样可以确保在连接对象上调用.Dispose()
,从而确保清理所有未管理的资源。
托管资源是指纯.NET代码,由运行时管理并受其直接控制的资源。
非托管资源是指不是由运行时管理的资源,例如文件句柄、固定内存、COM对象、数据库连接等。
评论:您可能没有直接持有非托管资源。但是,您可能通过托管的“包装类”(例如System.IO.FileStream)间接持有非托管资源。这样的包装类通常直接或通过继承实现IDisposable。我这样理解"托管"和"非托管"这两个词:
"托管"指的是.NET沙箱内的任何内容。这包括所有.NET Framework类。
"非托管"指的是.NET沙箱之外的荒野。这包括通过调用Win32 API函数返回给您的任何内容。
如果您从未调用过Win32 API函数,也没有获得任何Win32“句柄”对象,则不持有任何非托管资源。通过.NET Framework类方法打开的文件和流都是托管封装器。
1 链接最初由 Sachin Shanbhag's answer 分享。引用材料日期为2005年11月17日。请注意,我已经轻微地编辑了引用的内容。
托管资源是可以被垃圾回收器释放的资源,而非托管资源则不能被垃圾回收器释放。因此需要使用析构函数来释放非托管资源。