ITEM 15 : Utilize using and try/finally for Resource Cleanup.
(리소스 해제를 위해서 using과 try/finally 구문을 사용하라.)
■ 요약 및 장점
1. unmanaged 자원을 사용하는 타입들은 Dispose()를 명시적으로 호출해서 자원을 해제 해야한다.
사용자가 해재하지 못하는 경우에 대비해서 finalizer를 구현해놨지만, 그것은 finalizser가 실행되기 전까지 메모리에 오래 남아있게된다.
따라서 사용이 끝난후에 명시적으로 해제를 해줘야 한다.
2. using을 사용하면 C# compiler가 Dispose()를 호출되는 것을 보장해준다.
using 내에 있는 object에 대해서 자동으로 try/finally block을 생성해준다.
3. using 구문에 사용할 수 있는 object는 IDisposable()을 지원하는 타입만 사용이 가능하다. 그렇지 않는 경우에는 오류가 발생한다.
4. using 구문은 IDisposable 인터페이스를 지원하는 compile-time의 타입만 지원한다.
즉 사용자가 생성한 클래스가 런타임에 동적으로 바뀌게 된다면 오류가 발생한다.
이때에는 as 구문을 이용해서(obj as IDisposable) 사용하면 안전한 코드를 생성할 수 있다.
5. using 구문을 하나이상 사용하게 되면 IL에서는 조잡한 코드가 생성이 된다. 이런경우에는 수동으로 try/finally block을 생성해주는 편이 좋다.
6. IDisposable 인터페이스를 구현하는 object는 using 구문 내에 작성해주는 것이 좋다.
외부에서 할당이 되면 finally 구문에서 처리가 불가능하다.
7. Sqlconnection에서 자원해제를 할때에 Dispose()와 Close()가 존재한다. Dispose는 자원해제 이상의 일을한다.
Dispose는 가비지 컬렉터에게 object가 더 이상 finalize 될 필요없다고 알려준다.(GC.SuppressFinalize()를 호출한다.)
Close는 finalization이 필요없더라도 finalization Queue에 남아있게된다. 따라서 Close 보다 Dispose가 훨씬 좋다.
■ Terms
■ 해석이 모호하거나 중요한 구문
■ 단어
1. out of ~ : ~ 중에서
2. hog : 돼지, 독차지하다
3. arbitrary : 임의적인/제멋 대로인, 독단적인
4. in effect : 사실상,시행중인
5. be the case : ~경우에, 이럴경우
6. nuance : 미묘한 차이, 뉘앙스
7. suppress : 진압하다,금하다,숨기다
■ 피드백
'프로그래밍 > Effective C#' 카테고리의 다른 글
ITEM 17 : 표준 Dispose 패턴을 구현하라 (0) | 2015.04.23 |
---|---|
ITEM 16 : 불필요한 오브젝트 생성을 하지마라 (0) | 2015.04.23 |
ITEM 14 : 중복되는 초기화 로직을 최소화 하라. (0) | 2014.05.30 |
ITEM 13 : Static 멤버변수에 대해서 적절한 초기화를 하라. (0) | 2014.05.30 |
ITEM 12 : 할당문 보다 멤버 초기화를 선호해라 (0) | 2014.05.30 |