관리되지 않는(unmanaged) 시스템 리소스를 사용하는 타입은 IDisposable 인터페이스가 제공하는
Dispose() 메서드를 이용하여 명시적으로 리소스를 해제해야 한다. .NET 환경에서 이러한 규칙을
준수해야 할 책임은 해당 타입을 개발한 개발자의 몫이거나 하부 시스템의 역할이 아니라 해당
타입을 사용하는 사용자의 의무다. 이런 이유로 IDisposable 인터페이스를 구현한 타입을 사용할
때는 리소스 해제를 위해 반드시 Dispose() 를 호출해야 한다. 사용자 입장에서 Dispose() 메서드가
항상 호출되도록 코드를 작성하기 위한 최선의 방법은 using 문이나 try/finally 블록을 활용하는 것이
다.
관리되지 않는 리소스를 사용하는 모든 타입은 IDisposable 인터페이스를 반드시 구현해야 한다.
더불어, 사용자들이 Dispose() 메서드를 호출하는 것을 혹시라도 잊어버린 경우에 대비하기 위해서
finalizer를 방어적으로 작성해야 한다. Dispose() 메서드를 호출하는 것을 잊은 경우에도 finalizer 가
수행될 때 리소스가 해제될 수 있도록 하기 위함이다. 하지만 이 경우 해당 리소스가 메모리상에
더 오래 살아남을 것이기 대문에 리소스가 낭비될 뿐 아니라 프로그램의 수행 성능에도 나쁜 영향을
미치게 된다.
다행스럽게도 C# 언어 설계자들은 리소스를 명시적으로 해제하는 작업이 빈번이 이루어질 것으로
생각하고 사용자가 좀 더 쉽게 이러한 작업을 수행할 수 있도록 언어 명세에 관련 키워드를 추가해
뒀다.