共用方式為


HOW TO:實作 Dispose Finalize 模式 (Visual Basic)

更新:2007 年 11 月

DisposeFinalize 模式能確保會在不再需要物件時釋放資源。

範例

以下範例中的 ResourceClass 類別會利用 Managed 和 Unmanaged 資源,接著使用 DisposeFinalize 模式正確地處置 (Dispose) 它們。資源及其功能如下:

  • Dispose 方法的實作,允許類別的使用者處置類別執行個體。此方法會呼叫 Dispose(True) 處置物件的資源,然後呼叫 SuppressFinalize 以避免最終化程式碼再次執行。

  • 基底 Finalize 方法的覆寫,讓 Common Language Runtime (CLR) 記憶體回收行程處置類別執行個體。此方法會呼叫 Dispose(False) 處置物件的資源。請注意,如果之前已為物件呼叫了 Dispose,則對 SuppressFinalize 的呼叫會阻止記憶體回收行程呼叫 Finalize 方法。

  • Dispose 方法的多載,會進行處置工作。它接受布林 (Boolean) 參數 disposing,可以指出程式碼是否啟始了物件的處置。處置物件時,必須一同處置它的所有資源。而當 CLR 記憶體回收行程處置物件時,只有 Unmanaged 資源必須進行處置,至於 Managed 資源,若有需要記憶體回收行程也會自動加以處置。

如需詳細資訊,請參閱物件存留期:物件的建立和終結

    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 語言] 中。如需詳細資訊,請參閱 HOW TO:在您的程式碼中插入程式碼片段 (Visual Basic)

編譯程式碼

這個範例需要:

程式碼中必須進行以下變更:

  • 使用實作 IDisposable 的類別名稱取代 ResourceClass。

  • 在用到可能已處置之資源的任何方法中,使用 AnyOtherMethods 的測試。

  • 使用需要處置之類別中任何 Managed 物件的宣告,取代 managedResource 宣告。如果類別會實作 IDisposable 或具有 Close 方法,可能就需要進行處置。在 Dispose 方法中,關閉或處置這些物件。

  • 使用需要處置之類別中任何 Unmanaged 物件的宣告,取代 unManagedResource 宣告。這些物件的處置方法,需根據物件的定義方式而定。如需詳細資訊,請參閱物件的相關文件。

穩固程式設計

一旦呼叫了 Dispose 方法,集合中包含的物件將成為無效。您必須先測試 disposed 欄位,再於物件上執行任何作業。如需範例,請參閱程式碼範例中的 AnyOtherMethods 方法。

請參閱

概念

實作 Dispose 方法

參考

IDisposable

其他資源

記憶體回收