何时实施IDisposable的一般规则

时间:2009-07-14 14:18:36

标签: .net design-patterns

编辑:此问题与What is the difference between managed and native resources when disposing? (.NET)及其他许多问题重复。如果你有什么要补充的话,请回答其他人。


根据Krzysztof Cwalina和Brad Abrams的框架设计指南,包含一次性类型实例的类型应该实现IDisposable。

在最佳实践中实施IDisposable时,还有其他一般经验法则吗?

7 个答案:

答案 0 :(得分:12)

当你有一个包装非托管资源的类或者你的类有一个实现IDisposable的字段时,实现IDisposable。

答案 1 :(得分:4)

当您需要release非托管资源时,请实施IDisposable

答案 2 :(得分:2)

来自MSDN:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

  

使用此接口的Dispose方法与垃圾收集器一起显式释放非托管资源。当不再需要该对象时,对象的使用者可以调用此方法。

答案 3 :(得分:1)

每当您分配必须释放的资源时,例如文件,句柄等。例如,如果您使用的是Win32资源(不实现IDisposable),则应实现IDisposable以释放它们。

答案 4 :(得分:1)

每次我需要清理物品时,我通常会实施IDisposable。对我来说,这是编写抽象数据库/网络/文件系统的代码。

它只标记为垃圾收集器准备好的项目,而不是等待它自己尝试。

答案 5 :(得分:1)

IDisposable是程序员反对.Net内存泄漏的主要武器之一。虽然文档表明它应该用于外部资源,但我广泛使用IDisposable来发布内部资源,例如指向父类的指针。

通过创建两个相互引用的类(即foo和bar)来演示要求非常容易。 foo指的是bar,反之亦然。当foo超出范围时,GC看到bar仍然引用它,因此不会收集它(反之亦然)。没有收集记忆。

这与EventHandlers展示的问题风格相同,其中除非明确发布表单或实现WeakEvent模型,否则在表单关闭时不会释放引用。

我建议最好的做法是假设一个C ++编程模型,你自己使用Dispose 进行清理,除非你确信GC可以为你解决这个问题。

答案 6 :(得分:0)

如果类负责 IDisposable 对象的生命周期,那么它应该实现 IDisposable 接口并处理它(或使用 {{1} } 陈述)。这是因为如果你开始处理它们创建的单例,依赖注入容器会对你非常不满。