正文

如何:实现 Dispose Finalize 模式 (Visual Basic)2008-06-02 21:23:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/35846.html

分享到:

如何:实现 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)

编译代码

此示例需要:

必须在代码中进行以下更改:

  • ResourceClass 替换为实现 IDisposable 的类的名称。

  • 在使用可能已被释放的资源的任何方法中,在 AnyOtherMethods 中使用测试。

  • managedResource 声明替换为类中需要得到释放的任何托管对象的声明。如果某个类实现 IDisposable 或具有 Close 方法,则可能需要释放该类。在 Dispose 方法中,关闭或释放这些对象。

  • unManagedResource 声明替换为类中需要得到释放的非托管对象的声明。用于释放这些对象的方法取决于对象的定义方式。有关详细信息,请查阅有关对象的文档。

可靠编程

一旦调用了 Dispose 方法,集合中包含的对象将会无效。在对象上执行任何操作之前,您应测试 disposed 字段。有关示例,请参见代码示例中的 AnyOtherMethods 方法。

请参见

阅读(2075) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册