관리되지 않는 리소스를 포함하는 형식은 IDisposable을 구현한다.
해당 형식을 상속받는 형식에서의 리소스 관리도 고려 해야 한다.
이를 위하여 가상(virtual)함수를 사용한다.
해당 인스턴스 사용 후에는 Dispose 함수를 호출하여 리소스 삭제를 가능하게 한다.
Dispose 함수 호출의 누락을 대비하여 소멸자를 구현한다.
Dispose 함수 호출로 리소스를 삭제한다면 소멸자 호출이 필요 없으므로 이를 GC에 알린다. 소멸자 호출을 필요로 하는 인스턴스는 GC에의한 수집이 늦어 지기 때문이다.
기본 IDisposable 구현
public class MyUnmanagedClass : IDisposable { IntPtr unmanagedResource; bool disposed = false; public MyUnmanagedClass() { //비관리 리소스 할당. //unmanagedResource = ... } public void Dispose() { this.Dispose(true); //소멸자를 호출 하지 않도록 설정. GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { // 관리 리소스 해지. } // 비관리 리소스 해지. unmanagedResource = IntPtr.Zero; this.disposed = true; } } ~MyUnmanagedClass() { this.Dispose(false); } }
하위 형식에서의 리소스 관리
public class MyUnmanagedClass2 : MyUnmanagedClass { bool disposed = false; protected override void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { // 관리 리소스 해지. } // 비관리 리소스 해지. this.disposed = true; } base.Dispose(disposing); } }
사용예
public static class TestClass { public static void Test() { var myUnmanagedClass = new MyUnmanagedClass(); myUnmanagedClass.Dispose(); using (var myUnmanagedClass2 = new MyUnmanagedClass2()) { } } }
댓글 없음:
댓글 쓰기