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의 인스턴스를 만들기 위해 생성자에 전달하는 인수 목록입니다. 매개 변수 목록을 참조하세요.
resourceexpression 필수입니다. resourcetype의 요구 사항을 충족하는 시스템 리소스를 참조하는 변수 또는 식입니다. 두 번째 구문 대안을 사용하는 경우 제어를 Using 문에 전달하기 전에 리소스를 획득해야 합니다.

설명

코드에 파일 핸들, COM 래퍼 또는 SQL 연결과 같은 관리되지 않는 리소스가 필요한 경우가 있습니다. Using 블록은 코드가 완료되면 이러한 리소스를 하나 이상 폐기하도록 보장합니다. 이렇게 하면 다른 코드에서 사용할 수 있습니다.

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

Using 블록은 획득, 사용, 폐기의 세 부분으로 구성됩니다.

  • 획득은 변수를 만들고 시스템 리소스를 참조하도록 초기화하는 것을 의미합니다. Using 문은 하나 이상의 리소스를 획득할 수 있습니다. 그렇지 않으면 블록에 들어가기 전에 정확히 하나의 리소스를 획득하여 Using 문에 제공할 수 있습니다. resourceexpression을 제공하는 경우 Using 문에 제어를 전달하기 전에 리소스를 획득해야 합니다.

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

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

동작

Using 블록은 Try 블록이 리소스를 사용하고 Finally 블록이 리소스를 삭제하는 Try...Finally 구문처럼 동작합니다. 이로 인해 Using 블록은 블록을 종료하는 방법에 관계없이 리소스 폐기를 보장합니다. 이는 StackOverflowException을 제외하고 처리되지 않은 예외의 경우에도 마찬가지입니다.

Using 문으로 획득한 모든 리소스 변수의 범위는 Using 블록으로 제한됩니다.

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

resourcenameNothing인 경우 Dispose에 대한 호출이 수행되지 않으며 예외가 throw되지 않습니다.

Using 블록 내에서 구조적 예외 처리

Using 블록 내에서 발생할 수 있는 예외를 처리해야 하는 경우 완전한 Try...Finally 구문을 추가할 수 있습니다. Using 문이 리소스 획득에 실패하는 경우를 처리해야 하는 경우 resourcenameNothing인지 확인하기 위해 테스트할 수 있습니다.

Using 블록 대신 구조적 예외 처리

리소스 획득을 보다 세밀하게 제어해야 하거나 Finally 블록에 추가 코드가 필요한 경우 Using 블록을 Try...Finally 구문으로 다시 작성할 수 있습니다. 다음 예에서는 resource의 획득 및 폐기와 동등한 스켈레톤 TryUsing 구문을 보여 줍니다.

Using resource As New resourceType
    ' Insert code to work with resource.
End Using

' For the acquisition and disposal of resource, the following  
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try
    ' Insert code to work with resource.
Finally
    If resource IsNot Nothing Then
        resource.Dispose()
    End If
End Try

참고 항목

Using 블록 내부의 코드는 resourcename의 개체를 다른 변수에 할당해서는 안 됩니다. Using 블록을 종료하면 리소스가 삭제되고 다른 변수는 리소스가 가리키는 리소스에 액세스할 수 없습니다.

예시

다음 예에서는 log.txt라는 파일을 만들고 파일에 두 줄의 텍스트를 씁니다. 또한 예에서는 동일한 파일을 읽고 텍스트 줄을 표시합니다.

TextWriterTextReader 클래스는 IDisposable 인터페이스를 구현하므로 코드는 Using 문을 사용하여 쓰기 및 읽기 작업 후에 파일이 올바르게 닫히는지 확인할 수 있습니다.

Private Sub WriteFile()
    Using writer As System.IO.TextWriter = System.IO.File.CreateText("log.txt")
        writer.WriteLine("This is line one.")
        writer.WriteLine("This is line two.")
    End Using
End Sub

Private Sub ReadFile()
    Using reader As System.IO.TextReader = System.IO.File.OpenText("log.txt")
        Dim line As String

        line = reader.ReadLine()
        Do Until line Is Nothing
            Console.WriteLine(line)
            line = reader.ReadLine()
        Loop
    End Using
End Sub

참고 항목