본문 바로가기
C#

[C#] Dispose 상속 및 재정의

by Jcoder 2020. 11. 27.

class ClientClass : IDisposable

{

    private bool disposedValue;

 

    protected virtual void Dispose(bool disposing)

    {

        if (!disposedValue)

        {

        if (disposing)

        {

            // TODO: 관리형 상태(관리형 개체)를 삭제합니다.

        }

 

        // TODO: 비관리형 리소스(비관리형 개체)를 해제하고 종료자를 재정의합니다.

        // TODO: 큰 필드를 null로 설정합니다.

       // 비관리 메모리 해제구문

 

        disposedValue = true;

        }

    }

 

    // // TODO: 비관리형 리소스를 해제하는 코드가 'Dispose(bool disposing)'에 포함된 경우에만 종료자를 재정의합니다.

    // ~ClientClass()

    // {

    //     // 이 코드를 변경하지 마세요. 'Dispose(bool disposing)' 메서드에 정리 코드를 입력합니다.

    //     Dispose(disposing: false);

    // }

 

    public void Dispose()

    {

        // 이 코드를 변경하지 마세요. 'Dispose(bool disposing)' 메서드에 정리 코드를 입력합니다.

        Dispose(disposing: true);

        GC.SuppressFinalize(this);

    }

}

 

종료자는 개발자가 Dispose 메소드를 명시적으로 호출해 주었다면 굳이 호출될 필요가 없다.

즉 Dispose가 호출된 객체는 GC가 그 객체를 관리 힙에서 제거하는 과정에서 종료 큐에 대한 고려를 하지 않아도 된다.

 

ClientClass 를 new로 생성하면 종료 큐에 객체가 추가된다. 하지만 개발자가 Dispose 메서드를 호출한 경우에는 GC.SuppressFinalize가 실행됨으로써 종료 큐에서 제거된다. 따라서 종료자가 정의되지 않은 객체와 동일한 상태로 바뀌기 때문에 결과적으로는 GC의 부담을 덜어준다.

 

나중에 비관리 자원을 해제해야 할 상황이 생긴다면 // 비관리 메모리 해제구문에서 코드를 교체해서 사용하면 된다.