IDisposable?

김승욱·2025년 9월 3일
namespace System
{
    public interface IDisposable
    {
        void Dispose();
    }
}
  • C#의 using문은 IDisposable을 구현하는 개체에 대해
    Dispose 메서드를 try/finally 블록을 이용해서 호출하는 코드를 단축 표기
//컴파일러는 이 코드를
using (StreamWriter writer = new StreamWriter(Console.OpenStandardOutput()))
{
	// ...
}
    
// 이렇게 바꾸어서 컴파일 합니다.
StreamWriter writer = new StreamWriter(Console.OpenStandardOutput());
try
{
	// ...
}
finally
{
	if(writer != null)
    	((IDisposable)writer).Dispose();
}
  • 예외가 발생 하거나 기타 이유로 try 블록을 벗어날 경우에도 반드시 Dispose가 호출됨.

Dispose

  • 특별한 표준안이나 명세는 없으나 사실상의 표준이 존재
  1. 처분된 객체는 다시 살릴 수 없음
  • 처분된 객체의 메서드(Dispose 제외), 속성을 호출하면 ObjectDisposedExcetion 예외 발생
  1. 한 객체에 대해 Dispose를 여러번 호출 가능
  2. IDispose X가 IDispose Y를 소유한 경우, X의 Dispose는 Y의 Dispose를 자동으로 호출

Dispose를 호출해야 할 때

  • 거의 모든 경우에서 의심스럽다면 사용해서 처분하는 것이 안전함
  • 가끔 처분하지 말아야 할 상황
  1. 현재 코드가 객체를 소유하지 않을 때. 정적 필드나 속성을 통해서 공유 객체를 얻은 경우
    ex) Brushes.Blue, Font.FromHdc 등을 통해 얻은 객체들

  2. 객체의 Dispose가 상황에 맞지 않는 작업을 수행 할 경우
    ex) MemoryStream: 나중에 스트림을 읽거나 써야 할 경우
    StreamReader, StreamWriter: 스트림을 계속 열어두고 싶을 때(Flush를 호출하여 비워줘야 함)
    IDbConnection: 나중에 Open으로 연결을 다시 열고 싶을 때(Close를 호출하여 닫아줘야 함)
    DataContext: 게으르게 평가되는 질의가 문맥에 연결되어 있을 가능성이 있을 경우

  3. 객체의 설계 차원에서 Dispose가 꼭 필요한 것이 아닌 경우, 객체를 처분하려면 프로그램이 쓸대없이 복잡해질 때

  • 기반 클래스가 처분 가능이라서 처분 가능 형식이 된 것일 뿐, 본질적인 마무리 작업을 하지 않음
    ex) WebClient, StringReader, StringWriter, BackgroundWorker 등
profile
유니티 꿈나무

0개의 댓글