using 문(C# 참조)

업데이트: 2008년 7월

IDisposable 개체를 올바르게 사용할 수 있게 해 주는 편리한 구문을 제공합니다.

예제

다음 예제에서는 using 문을 사용하는 방법을 보여 줍니다.

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
    string s = null;
    while((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

설명

FileFont는 관리되지 않는 리소스(이 경우 파일 핸들 및 장치 컨텍스트)에 액세스하는 관리되는 형식의 예제입니다. 관리되는 형식을 캡슐화하는 관리되지 않는 리소스 및 클래스 라이브러리 형식에는 여러 가지가 있습니다. 이러한 모든 형식은 IDisposable 인터페이스를 구현해야 합니다.

일반적으로 IDisposable 개체를 사용할 때는 using 문에서 해당 개체를 선언하고 인스턴스화해야 합니다. using 문은 개체의 Dispose 메서드를 올바른 방법으로 호출하며, 앞에서 보여 준 것과 같이 사용할 경우 Dispose가 호출되면 즉시 해당 개체 자체가 범위를 벗어나도록 합니다. using 블록 내에서 개체는 읽기 전용이며 수정하거나 다시 할당할 수 없습니다.

using 문은 개체의 메서드를 호출하는 동안 예외가 발생하는 경우에도 Dispose가 호출되도록 합니다. try 블록 내에 개체를 배치한 다음 finally 블록에서 Dispose를 호출해도 동일한 결과를 얻을 수 있습니다. 실제로 이 방식은 컴파일러에서 using 문이 변환되는 방식입니다. 이전의 코드 예제는 컴파일 타임에 다음 코드로 확장됩니다. 중괄호를 추가하면 개체의 제한된 범위가 만들어집니다.

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

using 문에 여러 개체를 사용할 수 있지만 이 경우 각 개체는 다음 예제와 같이 using 문 안에 선언해야 합니다.

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

리소스 개체를 인스턴스화하고 using 문에 변수를 전달할 수도 있지만 이 방법은 가장 좋은 방법은 아닙니다. 이 경우 관리되지 않는 리소스에 더 이상 액세스할 수 없더라도 제어가 using 블록을 벗어난 후 개체는 범위에 남아 있습니다. 즉, 개체는 더 이상 완전히 초기화되지 않습니다. using 블록 외부에서 개체를 사용하려고 하면 예외가 throw될 수 있습니다. 이러한 이유로 using 문에서 개체를 인스턴스화하고 해당 범위를 using 블록으로 제한하는 것이 일반적으로 더 좋습니다.

Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
    // use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight(); 


C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 단원을 참조하십시오.

  • 5.3.3.17 Using 문

  • 8.13 using 문

참고 항목

개념

C# 프로그래밍 가이드

Dispose 메서드 구현

참조

C# 키워드

using 지시문(C# 참조)

Finalize 및 Dispose를 구현하여 관리되지 않는 리소스 정리

기타 리소스

C# 참조

가비지 수집

변경 기록

날짜

변경 내용

원인

2008년 7월

소개 다음에 코드 예제를 추가했습니다.

콘텐츠 버그 수정