.NET中的托管与非托管资源 有什么不同?

我正在阅读有关“内存管理和指针”的Wrox专业C#4和.NET 4章节,特别是关于垃圾收集如何在.NET中工作的内容。 它说“垃圾收集器不知道如何释放非托管资源(如文件句柄,网络连接和数据库连接)”,这就是为什么这样的类应该声明析构函数(又名“终结器”)或实现IDisposable

看起来,所有这些“非托管资源”的例子都涉及到与应用程序中的外部系统的交互,并且独立于.NET Framework。 但是,我不确定这是否是完全的区别,所以,

非托管资源和托管资源所具有的独特特征究竟是什么?


你做对了:
托管资源由CLR管理,非托管资源不是。 换句话说:托管资源只存在于.NET世界中,而非托管资源来自普通的Win32世界。


使用托管资源(即内存),您不必担心完成使用后会发生什么; CLR负责照顾这一点。

非托管资源(有几种类型:Windows内核对象,GDI对象,USER对象) 必须在完成使用后才能释放回系统 。 这会在您的进程终止时自动发生,但如果在此期间泄漏它们,则会出现严重问题,因为您正在泄漏系统中所有进程共享的资源。

当然,.NET中有几个类包装这些非托管资源(使用dispose / finalize模式),并为您付出了辛勤的劳动。 如果可以的话,使用这些。


术语“非托管资源”令人困惑。 一个更有用的概念是“清理责任”。 如果一个对象拥有非托管资源,那意味着三件事情:

  • 它操纵一些更长寿的实体,
  • 该实体可能处于需要清理的状态,并且
  • 该对象负责提供所需的清理

    一般来说,术语“被管理资源”被用于指代持有非托管资源的对象,但是如果它们被发现被放弃并且将使用这种通知来提供(通过Finalize例程)垃圾收集器的通知清理(​​如果它们在正常清理方法被调用之前被抛弃)。 有些人使用术语“托管资源”来指代不需要任何清理的事情,但我不喜欢这样的用法,因为没有任何其他良好的术语来指代应该手动清理的内容,但是如果没有发生正常清理,将使用终结作为后备。

    请注意,虽然非托管资源通常是诸如文件,GDI实体等的操作系统句柄之类的东西,但以这些术语来考虑它们是错误的。 非托管资源可能无法访问.Net框架之外的任何内容; 事件处理程序是一个常见的例子。 非托管资源的关键方面是他们需要清理,而未能执行这种清理会产生一些不良后果。

    链接地址: http://www.djcxy.com/p/54505.html

    上一篇: Managed vs Unmanaged Resources in .NET. What's the difference?

    下一篇: Clean Up Vs Memory Reclaim in .Net