Using 문(Visual Basic)

Using 블록의 시작을 선언하며 선택적으로 블록이 제어하는 시스템 리소스를 가져옵니다.

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

구성 요소

용어

내용

resourcelist

resourceexpression을 제공하지 않는 경우 필수적 요소입니다. 이 Using 블록이 제어하는 하나 이상의 시스템 리소스의 목록입니다.

resourceexpression

resourcelist를 제공하지 않는 경우 필수적 요소입니다. 이 Using 블록이 제어하는 시스템 리소스를 참조하는 참조 변수나 식입니다.

statements

선택적 요소로서, Using 블록이 실행하는 문 블록입니다.

End Using

필수적 요소로서, Using 블록의 정의를 종료하고 이 블록이 제어하는 모든 리소스를 삭제합니다.

resourcelist 구성 요소에서 각 리소스의 구문과 구성 요소는 다음과 같습니다.

resourcename As New resourcetype [ ( [ arglist ] ) ]

또는

resourcename As resourcetype = resourceexpression

resourcelist 구성 요소

용어

내용

resourcename

필수적 요소로서, Using 블록이 제어하는 시스템 리소스를 참조하는 참조 변수입니다.

New

Using 문이 리소스를 가져오는 경우 필수적 요소입니다. 리소스를 이미 가져온 경우에는 둘째 대체 구문을 사용합니다.

resourcetype

필수적 요소로서, 리소스의 클래스입니다. 클래스는 IDisposable 인터페이스를 구현해야 합니다.

arglist

선택적 요소로서, resourcetype의 인스턴스를 만들기 위해 생성자에 전달하는 인수의 목록입니다. 매개 변수 목록(Visual Basic)를 참조하십시오.

resourceexpression

필수적 요소로서, resourcetype의 요구 사항에 맞는 시스템 리소스를 참조하는 변수 또는 식입니다. 둘째 대체 구문을 사용하는 경우 Using 문에 제어를 전달하기 전에 리소스를 가져와야 합니다.

설명

경우에 따라 코드에 파일 핸들, COM 래퍼 또는 SQL 연결과 같은 관리되지 않는 리소스가 필요합니다. Using 블록은 코드가 이러한 리소스로 작업을 마칠 때 해당 리소스를 하나 이상 삭제합니다. 따라서 다른 코드에서 이러한 리소스를 사용할 수 있습니다.

관리되는 리소스는 구성 요소의 추가 코딩 없이 .NET Framework GC(가비지 수집기)에서 삭제됩니다. 관리되는 리소스에 대해서는 Using 블록이 필요하지 않습니다. 그래도 Using 블록을 사용하여 가비지 수집기를 기다리지 않고 관리 리소스를 강제로 삭제할 수 있습니다.

Using 블록은 가져오기, 사용 및 삭제의 세 부분으로 구성됩니다.

  • 가져오기는 시스템 리소스를 참조하기 위해 변수를 만들고 이를 초기화하는 것을 의미합니다. Using 문은 하나 이상의 리소스를 가져오고 블록에 들어가기 전에 하나의 리소스만 가져와서 이 리소스를 Using 문에 제공할 수 있습니다. resourceexpression을 제공하는 경우 Using 문에 제어를 전달하기 전에 리소스를 가져와야 합니다.

  • 사용은 리소스에 액세스하고 이러한 리소스를 사용하여 작업을 수행하는 것을 의미합니다. Using과 End Using 사이에 있는 문은 리소스 사용을 나타냅니다.

  • 삭제는 resourcename에 있는 개체의 Dispose 메서드를 호출하는 것을 의미합니다. 따라서 개체에서 리소스를 완전히 종료할 수 있습니다. End Using 문은 Using 블록의 제어를 받는 리소스를 삭제합니다.

동작

Using 블록은 Try 블록이 리소스를 사용하고 Finally 블록이 리소스를 삭제하는 Try...Finally 구문처럼 동작합니다. 따라서 블록을 종료하는 방법에 관계없이 Using 블록은 리소스를 삭제합니다. StackOverflowException을 제외하고 처리되지 않은 예외의 경우에도 이와 같이 동작합니다.

Using 문을 사용하여 가져오는 각 리소스 변수의 범위는 Using 블록으로 제한됩니다.

Using 문에 둘 이상의 시스템 리소스를 지정하면 Using 블록을 다른 Using 블록 내에 중첩한 것과 같습니다.

Using 블록 내의 구조적 예외 처리

Using 블록 내에 발생할 수도 있는 예외를 처리해야 하는 경우 전체 Try...Finally 구문을 이 블록에 추가할 수 있습니다. Using 문이 리소스를 제대로 가져오지 못하는 경우를 처리할 때는 resourcename이 Nothing인지 테스트할 수 있습니다.

Using 블록 이외의 구조적 예외 처리

리소스 가져오기를 보다 세밀하게 제어해야 하거나 Finally 블록에 추가 코드가 필요한 경우 Using 블록을 Try...Finally 구문으로 다시 작성할 수 있습니다. 다음 예제에서는 resource 가져오기 및 삭제에 해당하는 기본 Try 및 Using 구문을 보여 줍니다.

Using resource As New resourceType 
    ' Insert code to work with resource.
End Using
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Finally 
    resource.Dispose() 
End Try 

참고

Using 블록 내부에 있는 코드는 resourcename에 있는 개체를 다른 변수에 할당하지 않아야 합니다. Using 블록을 종료하면 리소스가 삭제되고 다른 변수는 이 블록이 가리키는 리소스에 액세스할 수 없습니다.

예제

다음 예제에서는 Using 블록을 사용하여 새 글꼴을 가져옵니다. 이렇게 하면 코드에서 이 블록을 종료할 때 글꼴에 대한 Dispose 메서드를 시스템에서 호출할 수 있습니다.

Public Sub setbigbold(ByVal c As Control)
    Using nf As New System.Drawing.Font("Arial", 12.0F,
        System.Drawing.FontStyle.Bold)

        c.Font = nf
        c.Text = "This is 12-point Arial bold"
    End Using
End Sub

참고 항목

작업

방법: 시스템 리소스 해제(Visual Basic)

참조

IDisposable

Try...Catch...Finally 문(Visual Basic)

System.Drawing

Font