namespace System
{
public interface IDisposable
{
void Dispose();
}
}
//컴파일러는 이 코드를
using (StreamWriter writer = new StreamWriter(Console.OpenStandardOutput()))
{
// ...
}
// 이렇게 바꾸어서 컴파일 합니다.
StreamWriter writer = new StreamWriter(Console.OpenStandardOutput());
try
{
// ...
}
finally
{
if(writer != null)
((IDisposable)writer).Dispose();
}
Dispose
Dispose를 호출해야 할 때
현재 코드가 객체를 소유하지 않을 때. 정적 필드나 속성을 통해서 공유 객체를 얻은 경우
ex) Brushes.Blue, Font.FromHdc 등을 통해 얻은 객체들
객체의 Dispose가 상황에 맞지 않는 작업을 수행 할 경우
ex) MemoryStream: 나중에 스트림을 읽거나 써야 할 경우
StreamReader, StreamWriter: 스트림을 계속 열어두고 싶을 때(Flush를 호출하여 비워줘야 함)
IDbConnection: 나중에 Open으로 연결을 다시 열고 싶을 때(Close를 호출하여 닫아줘야 함)
DataContext: 게으르게 평가되는 질의가 문맥에 연결되어 있을 가능성이 있을 경우
객체의 설계 차원에서 Dispose가 꼭 필요한 것이 아닌 경우, 객체를 처분하려면 프로그램이 쓸대없이 복잡해질 때