Dispose Finalize 模式可确保当不再需要对象时释放资源。
示例
下面的示例中的 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 语句。
必须在代码中进行以下更改:
-
将 ResourceClass 替换为实现 IDisposable 的类的名称。
-
在使用可能已被释放的资源的任何方法中,在 AnyOtherMethods 中使用测试。
-
将 managedResource 声明替换为类中需要得到释放的任何托管对象的声明。如果某个类实现 IDisposable 或具有 Close 方法,则可能需要释放该类。在 Dispose 方法中,关闭或释放这些对象。
-
将 unManagedResource 声明替换为类中需要得到释放的非托管对象的声明。用于释放这些对象的方法取决于对象的定义方式。有关详细信息,请查阅有关对象的文档。
可靠编程
一旦调用了 Dispose 方法,集合中包含的对象将会无效。在对象上执行任何操作之前,您应测试 disposed 字段。有关示例,请参见代码示例中的 AnyOtherMethods 方法。
评论