一次性使用和管理资源
可能重复:
正确使用IDisposable接口
我有一个拥有托管和非托管资源的类。 我正在使用IDisposable释放未管理的资源。 我应该在dispose方法中释放托管资源吗? 或者我可以让它发布到GC来释放托管资源?
如果你看看下面的文档,你会发现这一行:
所以在你的dispose方法中,你应该处理也实现IDisposable的管理资源。 如果一个对象没有实现这个,你不必处理它。
我建议使用终结器的类(C#编译器为任何具有析构函数的类生成终结器)应避免保留对最终定义中不会使用的任何对象的引用。 除了相对较少的例外情况,保存封装在对象中的资源的类应避免保留未封装的资源。 相反,这些资源应该封装到自己的对象中,以便它们可以与其他包含资源的对象一起被保存。
一旦处理好了,拥有封装在其他对象中的资源的任何类的正确行为通常是在它自己的Dispose方法中对所有这些资源调用Dispose,而不是实现一个终结器(对于C# - 没有析构函数,这会导致编译器生成终结器)。 如果终结器运行在包含其他可终结对象的对象上,那么每个对象通常都处于以下三种状态之一:
只有在第二种情况下,才有理由考虑对其他对象进行清理。
请注意,顺便说一句,垃圾回收器几乎不应该依赖于除释放对象实例直接消耗的内存之外的任何事情。 确定性处理几乎总是好得多。 人们唯一应该故意使用垃圾收集器来清理资源的时候,就是要创建相对低成本的资源,这些资源在垃圾收集时已知可以有效地清理自己,并且这些实例将足够广泛分享,发现最后一个离开范围时否则不切实际。 尽管放弃一次性物品有时有很好的理由,但放弃一次性物品却没有任何正当理由总是一个错误(如果放弃一次性物品是合适的,那么证明理由是合适的)。
链接地址: http://www.djcxy.com/p/54471.html