IDisposable 과 표준 Dispose 패턴 질문

안녕하세요. 2월 말인데도 기온이 춥네요. 감기 조심하시길 바랍니다~
Effective C#을 접한 뒤로 표준 Dispose패턴을 구현하는데 항상 주의하는데요. 제가 제대로 이해한 것이 맞는지 확신이 서질 않습니다. 제가 이해한 내용을 명제로 작성했는데 답변해주신다면 정말 감사하겠습니다.

Q1-1. 모든 IDisposable을 구현한 타입은 비관리 리소스다.
Q1-2. (역) 모든 비관리 리소스는 IDisposable로 구현된다.

Q2. Dipose()시 해제해야 하는 관리 리소스는 이벤트 핸들러, 델리게이트(Action, Func) 해제 등이 있다.

  • 예: 이벤트 구독자일 경우 구독한 이벤트를 해제해야 이벤트 생성자의 lifecycle과 무관하게 가비지로 수집됩니다.

Q3-1. (인터페이스 메서드가 아닌) 표준 패턴을 위한 Dipose(bool isDisposing) 에서 isDisposing으로 관리/ 비관리 리소스를 따로 해제 하는 이유는 Dipose()가 명시적으로 호출될 경우 관리 리소스까지 해제하고, 소멸자에 의해 방어적으로 호출되는 경우 관리 리소스를 해제할 필요가 없기 때문이다.
Q3-2. Dipose(false)는 소멸자에서만 호출해야 한다.

Q4. 상속을 막은 IDisposable을 구현한 sealed 클래스는 표준 Dipose 패턴을 구현할 필요가 없고, IDisposable만 구현하면 된다

하나의 답변만 달아주셔도 됩니다. 감사합니다!

IDisposable은 비관리 리소스용이 아닙니다. 현실적으로 비관리 리소스용은 finalizer를 통해 구현해야 합니다.

단지, finalizer도 내부적으로는 Dispose 메서드를 경유하기 때문에 그런 식의 오해가 있는 것입니다. 다음의 글을 참고하세요.

디버깅 기술: 9. .NET IDisposable 처리 정리 (sysnet.pe.kr)

3개의 좋아요