다음을 통해 공유


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 획득해야 합니다.

  • 사용은 리소스에 액세스하고 작업을 수행하는 것을 의미합니다. 리소스의 Using 사용량을 나타내는 문입니다 End Using .

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

행동

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

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

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

Nothing경우 resourcename 호출 Dispose 이 이루어지지 않으며 예외가 throw되지 않습니다.

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

블록 내에서 발생할 수 있는 예외를 Using 처리해야 하는 경우 전체 TryFinally ... 생성을 추가할 수 있습니다. 명령문이 Using 리소스를 획득하는 데 성공하지 못한 경우 처리해야 하는 경우 테스트하여 있는지 Nothing확인할 resourcename 수 있습니다.

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

리소스 획득을 보다 세부적으로 제어해야 하거나 블록에 Finally 추가 코드가 필요한 경우 블록을 ... 생성으로 TryFinally 다시 작성 Using 할 수 있습니다. 다음 예제에서는 인수 및 Using 폐기resource에 해당하는 구조와 구조를 Try 보여 줍니다.

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 이름이 지정된 파일을 만들고 파일에 두 줄의 텍스트를 씁니다. 이 예제에서는 동일한 파일을 읽고 텍스트 줄을 표시합니다.

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

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

참고하십시오