我正在使用此处描述的模式来管理处置:http: //www.developerzen.com/2006/01/09/finalizableobject-developing-a-base-class-for-idisposable-objects/
什么算作"非托管资源?"
以下是我脑海中的一些令人困惑的问题:
我意识到博客文章有点陈旧.如果有一种更现代的方式来管理非托管和托管对象的生命周期,请提出建议.
编辑:无论是谁投票关闭此,请提供一些有关如何改进问题的详细信息.
我理解这种困惑.我认为有一些简单的指导方针可供遵循:
如果你的类"拥有"对另一个对象的引用(即你的对象创建了另一个对象,或者被赋予对该对象的引用,并且理解你的对象现在"拥有"它),那么你有责任进行任何必要的清理(如果有的话)
如果该对象是.NET对象并且未实现IDisposable接口,那么您可能不需要执行任何操作.按照惯例,IDisposable接口是我们用来声明我们的对象是否需要清理的接口.
如果该另一个对象是.NET对象并实现了IDisposable接口,那么您的类也应该实现IDisposable接口.在Dispose方法中,只需调用另一个对象的Dispose方法即可.
如果该其他对象是非托管对象或资源,那么您的类应该实现终结器以确保将清除非托管对象/资源.请遵循该博客文章中描述的指南,了解如何实现该指南.
以下是您的问题的一些具体答案.
- 在某些时候,.NET只是包装Win32调用,对吗?因此,大多数.NET对象都不是非托管资源吗?
即使.NET对象可能包装Win32调用,术语"非托管资源"也不合适,因为它是.NET对象,因此根据定义它是"托管资源".CLR处理这些对象的内存分配和垃圾回收.
- 那些我们有.NET包装器的COM对象怎么样 - 他们考虑了什么?
.NET包装器对象仍然是.NET对象,因此它们是"托管资源",但请注意它们必须实现自己的dispose/finalize逻辑.基本上,他们负责清理"非托管资源",以便您不必这样做.如果您正在为COM对象实现自己的包装器,那么您将负责实现必要的dispose/finalize逻辑来清理它,以便您的包装器的使用者不必这样做.
- 那些只从P/Invokes获得功能的托管类呢?
使用P/Invoke调用非托管代码的托管类可能正在分配非托管资源,具体取决于它调用的内容.因此,它可能需要实现必要的dispose/finalize逻辑来清理那些非托管资源.
- 那些内部使用本机库的C++/CLI类呢?
是的,那些也可能是从本机库分配非托管资源,因此它们也必须实现必要的析构函数/终结器逻辑.
- 在C#级别,具有析构函数的C++/CLI类现在实现了IDisposable ......他们考虑了什么?
在C++/CLI中,您可以选择将类声明为managed(使用ref关键字)或unmanaged(不使用ref关键字).如果使用ref关键字声明它,那么它是一个托管类; 它将在托管堆上分配,并且一旦它超出范围就会被垃圾收集器清理,并且不再有对它的引用.如果声明的类没有ref关键字,那么它是非托管的,必须明确清理.在任何一种情况下,类都可能已经分配了需要在析构函数/终结器中清理的非托管资源.
归档时间: |
|
查看次数: |
425 次 |
最近记录: |