ITEM17 : Implement the Standard Dispose Pattern.
(표준 Dispose 패턴을 구현하라)
n 요약 및 장점
1. 일반적인 자원해제 패턴은 Client가 자원해제를 잊지 않았다면, Unmanaged Resource를 IDisposable 인터페이스를 이용해서 해제(명시적 호출)하며, 만약 잊어버렸다면 방어적으로 Finalizer를 사용해서 자원해제를 한다.
2. Root base class는 자원해제를 위해서 IDisposable Interface를 구현해야 하며, 방어적인 메커니즘을 위해서 Finalizer를 추가해야만 한다. 하위 클래스들에서는 이 virtual method를 override해서 자원을 해제해야 한다.(Obejct.Finalize method)
3. 당신의 클래스가 unmanaged resources를 사용한다면 반드시 finalizer를 구현해서 사용자가 Dispose를 호출하지 않더라도 자원해제가 정상적으로 될 수 있게 해야 한다.
4. GC가 실행이 되면, 즉시 메모리에서 finalizer가 없는 object들을 해제한다. 메모리에 남은 finalizer가 있는 object들은 finalization Queue에 들어가게 된다. GC는 해당 object들의 finalizer를 실행하도록 새로운 쓰레드를 생성한다. 따라서 finalization이 필요한 object들은 메모리에 그렇지 않는 object들보다 더 오랫동안 남아있게된다. 그러나 선택의 여지가 없다. 방어적으로 하려면 당신의 타입들이 unmanaged resources를 잡고 있다면 finalizer를 구현해야 한다.
5. IDisposable.Dispose()는 4가지의 책임이 있다
① 모든 unmanaged resources를 해제
② 모든 managed resources를 해제(unhooking events들도 포함)
③ state flag를 object가 disposed됐다고 설정하는 것. 상태를 체크해야 하며 object가 dispose된 후에 해제된 리소스에 접근하는 모든 호출에 대해서 ObjectDisposed exceptions를 throw해야한다.
④ GC.SupressFinalize(this)를 호출해서 Finalization이 실행되는것을 금지해야한다.
6. 소스참고 ( dispose 패턴) : 위의 예제에서는 Finalize 메소드를 구현하지 않았는데 그 이유는 unmanaged resource를 사용하지 않았기 때문이다.
7. Dispose와 Finalize(~) 매소드 내에서 자원해제 이외의 처리를 하지 마라. 만약 그렇게 한다면 Object의 생명주기에 심각한 문제가 발생이된다. 특히 해당 클래스를 다시 사용 가능하게 전역변수에 할당하는 것은 문제가 된다.
8. Managed 환경에서는 finalizer를 구현할 필요가 없지만 object가 unmanaged type 또는 IDisposable 인터페이스를 구현한 member를 포함한다면 구현해야 한다.
n Terms
1. Unmanaged Resource: CLR에 의해서 관리가 되지 않는 자원들, GC가 이 자원에 대해서 존재자체를 모른다. 따라서 이런 자원을 사용하면 사용자가 메모리를 반드시 해제해줘야 한다. (예. File Handle, COM Object, Database Connection..)
2. Managed Resource: CLR에 의해서 관리되는 자원들. Garbage Collector가 자원해제를 담당한다.
n 해석이 잘 안되거나 중요한 내용
n 단어
1. thoroughly:완전히,대단히
2. in a timely fashion : punctually, 정각에
3. entry point : 진입점
4. Hog : 돼지(비육돈)
5. Encapsulate : 요약하다.
6. complication : 문제,합병증
7. comatose : 혼수상태의
8. cringe : 민망하게 하다, 움추려들게 하다.
9. Idiom : 관용구 , 숙어
'프로그래밍 > Effective C#' 카테고리의 다른 글
ITEM 19 : 값 타입에 대해서 0값이 유효한 상태가 되게 반드시 보장해야한다. (0) | 2015.04.30 |
---|---|
ITEM 18 : 값 타입과 참조 타임을 구별하라 (0) | 2015.04.23 |
ITEM 16 : 불필요한 오브젝트 생성을 하지마라 (0) | 2015.04.23 |
ITEM 15 : 리소스 해제를 위해서 using과 try/finally 구문을 사용하라. (0) | 2014.05.30 |
ITEM 14 : 중복되는 초기화 로직을 최소화 하라. (0) | 2014.05.30 |