방법: Dispose Finalize 패턴 구현(Visual Basic)

업데이트: 2007년 11월

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

기타 리소스

가비지 수집