如何:实现 Dispose Finalize 模式 (Visual Basic)
更新:2007 年 11 月
DisposeFinalize 模式可确保当不再需要对象时释放资源。
示例
下面的示例中的 ResourceClass 类利用了托管和非托管资源,然后使用 DisposeFinalize 模式来适当地释放它们。这些资源及它们的功能如下:
Dispose 方法的实现,该方法允许类的使用者释放类实例。此方法调用 Dispose(True) 来释放对象的资源,然后调用 SuppressFinalize 以防止终止代码执行第二次。
基本 Finalize 方法的重写,该方法允许公共语言运行库 (CLR) 垃圾回收器来释放类实例。此方法调用 Dispose(False) 来释放对象的资源。请注意,如果以前为对象调用了 Dispose,那么,它对 SuppressFinalize 的调用将使垃圾回收器无法调用 Finalize 方法。
Dispose 方法的重载,该方法执行释放操作。它接受 Boolean 参数 disposing,该参数指明您的代码是否已开始对象的释放过程。当您释放对象时,必须要释放它的所有资源。当 CLR 垃圾回收器释放对象时,只有非托管资源必须得到释放;垃圾回收器会在必要时自动释放托管资源。
有关更多信息,请参见 对象生存期:如何创建和销毁对象。
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 语句(.NET 命名空间和类型)。
必须在代码中进行以下更改:
将 ResourceClass 替换为实现 IDisposable 的类的名称。
在使用可能已被释放的资源的任何方法中,在 AnyOtherMethods 中使用测试。
将 managedResource 声明替换为类中需要得到释放的任何托管对象的声明。如果某个类实现 IDisposable 或具有 Close 方法,则可能需要释放该类。在 Dispose 方法中,关闭或释放这些对象。
将 unManagedResource 声明替换为类中需要得到释放的非托管对象的声明。用于释放这些对象的方法取决于对象的定义方式。有关详细信息,请查阅有关对象的文档。
可靠编程
一旦调用了 Dispose 方法,集合中包含的对象将会无效。在对象上执行任何操作之前,您应测试 disposed 字段。有关示例,请参见代码示例中的 AnyOtherMethods 方法。