Поделиться через


Практическое руководство. Реализация схемы 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).

Компиляция кода

Для этого примера необходимо:

Необходимо внести в код следующие изменения:

  • Следует заменить ResourceClass на имя класса, который реализует IDisposable.

  • Используйте проверку в AnyOtherMethods в любых методах, использующих ресурсы, которые могут быть удалены.

  • Замените объявление managedResource на объявления любых управляемых объектов в классе, которые должны быть удалены. Если класс реализует метод IDisposable или Close, он скорее всего должен быть удален. Эти объекты закрываются или удаляются с помощью метода Dispose.

  • Замените объявление unManagedResource на объявления любых неуправляемых объектов в классе, которые должны быть удалены. Метод уничтожения этих объектов зависит от того, как объект определен. Подробные сведения см. в документации на объект.

Отказоустойчивость

После вызова метода Dispose вложенные объекты в коллекции будут недопустимыми. Следует проверить поле disposed перед выполнением любой операции с объектом. Пример содержится в методе AnyOtherMethods в примере кода.

См. также

Основные понятия

Реализация метода Dispose

Ссылки

IDisposable

Другие ресурсы

Сборка мусора