释放对象的模式(称为释放模式)对对象的生存期进行规定。
类型的 Dispose 方法应释放它拥有的所有资源。 它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源。 父类型的 Dispose 方法应该释放它拥有的所有资源,进而调用其父类型的 Dispose 方法,从而在整个基类型层次结构中传播此模式。 若要帮助确保始终正确地清理资源,Dispose 方法应该可以多次调用而不引发异常。
对只使用托管资源的类型(如数组)实现 Dispose 方法并不能提高性能,原因是这些类型由垃圾回收器自动回收。 应主要对使用本机资源的托管对象和向 .NET Framework 公开的 COM 对象使用 Dispose 方法。 使用本机资源的托管对象(如 FileStream 类)实现 IDisposable 接口。
重要事项 |
---|
C++ 程序员不应该使用本主题。 而应参见 Destructors and Finalizers in Visual C++。 在 .NET Framework 2.0 版中,C++ 编译器为实现资源的确定性处置提供支持,并且不允许直接实现 Dispose 方法。 |
Dispose 方法应为它要释放的对象调用 SuppressFinalize 方法。 如果对象当前在终止队列中,则 SuppressFinalize 会阻止调用其 Finalize 方法。 请记住,执行 Finalize 方法会降低性能。 如果 Dispose 方法已完成清理对象的工作,垃圾回收器就不必调用对象的 Finalize 方法。
为 GC.KeepAlive 方法提供的代码示例演示了强行垃圾回收如何在回收对象的成员仍在执行时引起终结器运行。 在较长的 Dispose 方法末尾最好调用 KeepAlive 方法。
下面的代码示例演示为封装非托管资源的类实现 Dispose 方法的建议设计模式。
资源类通常是从复杂的本机类或 API 派生的,而且必须进行相应的自定义。 使用这一代码模式作为创建资源类的一个起始点,并根据封装的资源提供必要的自定义。