Como: Implementar a Dispose Finalize padrão (Visual Basic)

The DisposeFinalize pattern ensures that resources are released when the object is no longer needed.

Exemplo

The ResourceClass class in the following example utilizes managed and unmanaged resources and then uses the DisposeFinalize pattern to dispose of them properly.Os recursos e suas funções são:

  • A implementação do Dispose método, que permite que os usuários da classe de descarte de instâncias de classe. Este método chama Dispose(True) para descartar o objeto de recursos e, em seguida, chama SuppressFinalize Para evitar que o código de finalização da execução de uma segunda vez.

  • A substituir do base Finalize método, que permite que o coletor de lixo de tempo de execução (CLR) linguagem comum descarte de instâncias de classe. Este método chama Dispose(False) para descartar os recursos do objeto. Observe que, se Dispose foi chamado anteriormente para o objeto, sua telefonar para SuppressFinalize impediria que o coletor de lixo telefonar a Finalize método.

  • A sobrecarga do Dispose método faz o trabalho de descarte. Ele usa um parâmetro booliano, disposing, que indica se o seu código iniciadas descarte do objeto. Quando você descartar um objeto, todos os seus recursos devem ser eliminados.Quando o coletor de lixo CLR descarta de um objeto, somente os recursos não gerenciado devem ser descartados, o coletor de lixo descarta automaticamente os recursos gerenciado quando necessário.

Para obter mais informações, consulte Como objetos são criados e destruídos Outros recursos.

    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

Este exemplo de código também está disponível como um trecho de código IntelliSense.No selecionador de trechos de código, ele está localizado em Visual Basic Language.Para obter mais informações, consulte Como: Inserir trechos em seu Código (Visual Basic).

Compilando o código

Este exemplo requer:

Essas alterações devem ser feitas no código:

  • Substituir ResourceClass com o nome da classe que implementa IDisposable.

  • Use o teste em AnyOtherMethods todos os métodos usando recursos que talvez tenham eliminados.

  • substituir the managedResource declaração com declarações de qualquer gerenciado objetos na sua classe precisa ser eliminado. Se uma classe implementa IDisposable ou tem um Close método, ele provavelmente precisa ser eliminado. No Dispose método, fechar ou descartar esses objetos.

  • Substitua o unManagedResource declaração com declarações de objetos não gerenciados em sua classe precisa ser eliminado. O método de descarte desses objetos depende de como o objeto é definido.Para obter detalhes, consulte a documentação do objeto.

Programação robusta

Uma vez o Dispose método foi chamado, os objetos contidos na sua coleção não será válido. Você deve testar o disposed campo antes de executar quaisquer operações em seu objeto. Para obter um exemplo, consulte o AnyOtherMethods método no exemplo de código.

Consulte também

Conceitos

Implementando um método Dispose

Referência

IDisposable

Outros recursos

Coleta de Lixo