using 문(C# 참조)using Statement (C# Reference)

IDisposable 개체의 올바른 사용을 보장하는 편리한 구문을 제공합니다.Provides a convenient syntax that ensures the correct use of IDisposable objects.

Example

다음 예제에서는 using 문을 사용하는 방법을 보여 줍니다.The following example shows how to use the using statement.

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

설명Remarks

FileFont는 관리되지 않는 리소스에 액세스하는 관리되는 형식의 예입니다(이 경우 파일 핸들 및 장치 컨텍스트).File and Font are examples of managed types that access unmanaged resources (in this case file handles and device contexts). 다른 많은 종류의 관리되지 않는 리소스 및 이를 캡슐화하는 클래스 라이브러리 형식이 있습니다.There are many other kinds of unmanaged resources and class library types that encapsulate them. 이러한 형식은 모두 IDisposable 인터페이스를 구현해야 합니다.All such types must implement the IDisposable interface.

IDisposable 개체의 수명이 단일 메서드로 제한된 경우 using 문에서 선언하고 인스턴스화해야 합니다.When the lifetime of an IDisposable object is limited to a single method, you should declare and instantiate it in the using statement. using 문은 올바른 방법으로 개체에서 Dispose 메서드를 호출하며, (앞서 설명한 대로 사용하는 경우) Dispose가 호출되자마자 개체 자체가 범위를 벗어나도록 만듭니다.The using statement calls the Dispose method on the object in the correct way, and (when you use it as shown earlier) it also causes the object itself to go out of scope as soon as Dispose is called. using 블록 내에서 개체는 읽기 전용이며 수정하거나 다시 할당할 수 없습니다.Within the using block, the object is read-only and cannot be modified or reassigned.

using 문은 using 블록 내에서 예외가 발생하더라도 Dispose가 호출되도록 합니다.The using statement ensures that Dispose is called even if an exception occurs within the using block. try 블록 내부에 개체를 배치한 다음, finally 블록에서 Dispose를 호출해도 동일한 결과를 얻을 수 있습니다. 실제로 컴파일러는 이 방법으로 using 문을 변환합니다.You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; in fact, this is how the using statement is translated by the compiler. 이전의 코드 예제는 컴파일 시 다음 코드로 확장됩니다(개체의 제한된 범위를 만드는 여분의 중괄호 참고).The code example earlier expands to the following code at compile time (note the extra curly braces to create the limited scope for the object):

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

try-finally 문에 대한 자세한 내용은 try-finally 항목을 참조하세요.For more information about the try-finally statement, see the try-finally topic.

다음 예제와 같이 using 문에서 한 형식의 여러 인스턴스를 선언할 수 있습니다.Multiple instances of a type can be declared in the using statement, as shown in the following example:

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

리소스 개체를 인스턴스화한 후 using 문에 변수를 전달할 수 있지만, 이 방법이 최선은 아닙니다.You can instantiate the resource object and then pass the variable to the using statement, but this is not a best practice. 이 경우 컨트롤이 using 블록을 벗어난 후에도 개체가 범위 내에 있지만, 관리되지 않는 리소스에 액세스하지 못할 수 있습니다.In this case, after control leaves the using block, the object remains in scope but probably has no access to its unmanaged resources. 즉, 더 이상 완전히 초기화되지 않습니다.In other words, it's not fully initialized anymore. using 블록 외부에서 개체를 사용하려고 하면 예외가 throw될 위험이 있습니다.If you try to use the object outside the using block, you risk causing an exception to be thrown. 따라서 일반적으로 using 문에서 개체를 인스턴스화하고 using 블록에서 범위를 제한하는 것이 좋습니다.For this reason, it's generally better to instantiate the object in the using statement and limit its scope to the using block.

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(); 

IDisposable 개체를 삭제하는 방법에 대한 자세한 내용은 IDisposable을 구현하는 개체 사용을 참조하세요.For more information about disposing of IDisposable objects, see Using objects that implement IDisposable.

C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양을 참조하세요.For more information, see the C# Language Specification. C# 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.The language specification is the definitive source for C# syntax and usage.

참고 항목See Also

C# 참조C# Reference
C# 프로그래밍 가이드C# Programming Guide
C# 키워드C# Keywords
using 지시문using Directive
가비지 수집Garbage Collection
IDisposable을 구현하는 개체 사용Using objects that implement IDisposable
IDisposable 인터페이스IDisposable interface