방법: 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)을 참조하십시오.
코드 컴파일
이 예제에는 다음 사항이 필요합니다.
- System 및 System.ComponentModel 네임스페이스의 멤버에 액세스해야 합니다. 코드에서 멤버 이름을 정규화하지 않는 경우에는 Imports 문을 추가합니다. 자세한 내용은 Imports 문(.NET 네임스페이스 및 형식)을 참조하십시오.
코드에서 다음과 같은 변경 작업을 수행해야 합니다.
ResourceClass를 IDisposable을 구현하는 클래스 이름으로 바꿉니다.
삭제된 리소스를 사용하여 임의의 메서드의 AnyOtherMethods에서 테스트를 수행합니다.
managedResource 선언을 삭제되어야 하는 클래스의 관리되는 개체 선언으로 바꿉니다. 클래스가 IDisposable을 구현하거나 클래스에 Close 메서드가 있는 경우 해당 클래스를 삭제해야 할 수 있습니다. Dispose 메서드에서 이러한 개체를 닫거나 삭제합니다.
unManagedResource 선언을 삭제되어야 하는 클래스의 관리되지 않는 개체 선언으로 바꿉니다. 이러한 개체를 삭제하는 메서드는 개체가 정의되는 방식에 따라 다릅니다. 자세한 내용은 개체 설명서를 참조하십시오.
강력한 프로그래밍
Dispose 메서드가 호출되면 컬렉션에 포함된 개체를 사용할 수 없습니다. 개체에 대한 작업을 수행하기 전에 disposed 필드를 테스트해야 합니다. 예제를 보려면 코드 예제의 AnyOtherMethods 메서드를 참조하십시오.