Практическое руководство. Реализация схемы Dispose Finalize (Visual Basic)
Обновлен: Ноябрь 2007
Шаблон DisposeFinalize обеспечивает освобождение ресурсов, если объект больше не используется.
Пример
Класс ResourceClass в следующем примере использует управляемые и неуправляемые ресурсы, а также использует шаблон DisposeFinalize, чтобы удалить их должным образом. Ресурсами и их функциями являются:
Реализация метода Dispose, которая позволяет пользователям класса удалять экземпляры класса. Этот метод вызывает Dispose(True) для удаления ресурсов объекта, а затем вызывает SuppressFinalize, чтобы предотвратить вторичное выполнение кода завершения.
Переопределение базового метода Finalize, которое позволяет сборщику мусора среды CLR удалять экземпляры класса. Этот метод вызывает Dispose(False) для удаления ресурсов объекта. Обратите внимание, что если Dispose ранее вызывался для объекта, его вызов SuppressFinalize запрещает сборщику мусора вызов метода Finalize.
Перегрузка метода Dispose, которая выполняет удаление. Для этого необходим логический параметр 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 в примере кода.