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)。
編譯程式碼
這個範例需要:
- 存取 System 和 System.ComponentModel 命名空間的成員。如果您的程式碼中未完整限定成員名稱,請加入 Imports 陳述式。如需詳細資訊,請參閱 Imports 陳述式 (.NET 命名空間和型別)。
程式碼中必須進行以下變更:
使用實作 IDisposable 的類別名稱取代 ResourceClass。
在用到可能已處置之資源的任何方法中,使用 AnyOtherMethods 的測試。
使用需要處置之類別中任何 Managed 物件的宣告,取代 managedResource 宣告。如果類別會實作 IDisposable 或具有 Close 方法,可能就需要進行處置。在 Dispose 方法中,關閉或處置這些物件。
使用需要處置之類別中任何 Unmanaged 物件的宣告,取代 unManagedResource 宣告。這些物件的處置方法,需根據物件的定義方式而定。如需詳細資訊,請參閱物件的相關文件。
穩固程式設計
一旦呼叫了 Dispose 方法,集合中包含的物件將成為無效。您必須先測試 disposed 欄位,再於物件上執行任何作業。如需範例,請參閱程式碼範例中的 AnyOtherMethods 方法。