안녕하세요. 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만 구현하면 된다
하나의 답변만 달아주셔도 됩니다. 감사합니다!