什么是非托管对象?

5

什么是非托管对象?您能否用CLR的术语来解释一下?我在网上学到的是,非托管对象不在CLR环境下运行。您能否给我举一个非托管对象的例子?


1
抱歉,我的英语不太好... :) - NoviceToDotNet
4个回答

7
任何未被CLR内存管理(即垃圾回收器)管理的内存都是非托管内存。
操作系统文件句柄是.NET和Windows下一种非托管内存的例子。
为了正确处理非托管资源,建议您实现一个公共的Dispose或Close方法来执行对象所需的清理代码。IDisposable接口为实现该接口的资源类提供了Dispose方法。由于它是公共的,因此应用程序的用户可以直接调用Dispose方法以释放非托管资源使用的内存。当您正确实现Dispose方法时,Finalize方法成为一个保障,在Dispose方法未被调用的情况下清理资源。
参考资料:清理非托管资源

5
简单来说,未托管的对象是指不受 .Net 框架管理的对象。
最好的例子就是数据库连接或文件操作由操作系统处理,并需要显式释放(File.Close() 或 Connection close),并且不会被垃圾回收器自动处理。

1
IT 意味着未经管理的资源存储在堆栈中...我也对堆栈和堆感到困惑...我学到,对象存储在堆中,GC 负责清理堆中未使用的对象。 - NoviceToDotNet
这不是堆栈问题。这意味着 .NET Framework(以及在此情况下的GC)不负责处理其在内存中的释放。 - Zied

1
I learned on the internet that they say unmanaged objects don't run under the CLR environment.

这不对,CLR几乎可以做到C语言能做到的一切。在C#中,你有一个叫做unsafe的关键字,它允许你甚至访问指针和指针偏移量。我有一个项目,需要与游戏引擎进行大量的Interop操作,而C封装非常小,因为我可以在CLR/C#中处理所有内存对象。

通过“不运行”,他们可能想要明确表明未托管的对象不由虚拟机处理:你必须进行清理或创建包装类来为你执行清理。


1

VC++6.0的示例或者你在应用程序或网站中经常使用的许多ActiveX和COM对象都是非托管的,例如Excel VBA就是非托管的,还有太多其他的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接