如何:实现 Dispose Finalize 模式 (Visual Basic) Dispose Finalize 模式可确保当不再需要对象时释放资源。 示例 下面的示例中的 ResourceClass 类利用了托管和非托管资源,然后使用 DisposeFinalize 模式来适当地释放它们。这些资源及它们的功能如下: Dispose 方法的实现,该方法允许类的使用者释放类实例。此方法调用 Dispose(True) 来释放对象的资源,然后调用 SuppressFinalize 以防止终止代码执行第二次。 基本 Finalize 方法的重写,该方法允许公共语言运行库 (CLR) 垃圾回收器来释放类实例。此方法调用 Dispose(False) 来释放对象的资源。请注意,如果以前为对象调用了 Dispose,那么,它对 SuppressFinalize 的调用将使垃圾回收器无法调用 Finalize 方法。 Dispose 方法的重载,该方法执行释放操作。它接受 Boolean 参数 disposing,该参数指明您的代码是否已开始对象的释放过程。当您释放对象时,必须要释放它的所有资源。当 CLR 垃圾回收器释放对象时,只有非托管资源必须得到释放;垃圾回收器会在必要时自动释放托管资源。 有关更多信息,请参见对象生存期:如何创建和销毁对象。 Visual Basic 复制代码 Public Class ResourceClass Implements IDisposable Private managedResource As System.ComponentModel.Component Private unmanagedResource As IntPtr Protected disposed As Boolean = False Public Sub New() ' Insert appropriate constructor code here. End Sub Protected Overridable Overloads Sub Dispose( _ ByVal disposing As Boolean) If Not Me.disposed Then If disposing Then managedResource.Dispose() End If ' Add code here to release the unmanaged resource. unmanagedResource = IntPtr.Zero ' Note that this is not thread safe. End If Me.disposed = True End Sub Public Sub AnyOtherMethods() If Me.disposed Then Throw New ObjectDisposedException(Me.GetType().ToString, _ "This object has been disposed.") End If End Sub #Region " IDisposable Support " ' Do not change or add Overridable to these methods. ' Put cleanup code in Dispose(ByVal disposing As Boolean). Public Overloads Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub #End Region End Class 此代码示例也可用作 IntelliSense 代码段。在代码段选择器中,它位于“Visual Basic 语言”中。有关更多信息,请参见如何:在代码中插入代码段 (Visual Basic)。 编译代码 此示例需要: 访问 System 和 System.ComponentModel 命名空间的成员。如果没有在代码中完全限定成员名称,请添加 Imports 语句。有关更多信息,请参见 Imports 语句。 必须在代码中进行以下更改: 将 ResourceClass 替换为实现 IDisposable 的类的名称。 在使用可能已被释放的资源的任何方法中,在 AnyOtherMethods 中使用测试。 将 managedResource 声明替换为类中需要得到释放的任何托管对象的声明。如果某个类实现 IDisposable 或具有 Close 方法,则可能需要释放该类。在 Dispose 方法中,关闭或释放这些对象。 将 unManagedResource 声明替换为类中需要得到释放的非托管对象的声明。用于释放这些对象的方法取决于对象的定义方式。有关详细信息,请查阅有关对象的文档。 可靠编程 一旦调用了 Dispose 方法,集合中包含的对象将会无效。在对象上执行任何操作之前,您应测试 disposed 字段。有关示例,请参见代码示例中的 AnyOtherMethods 方法。 请参见 参考IDisposable 概念实现 Dispose 方法 其他资源垃圾回收

评论