Using 문(Visual Basic)Using Statement (Visual Basic)

Using 블록의 시작을 선언 하 고 필요에 따라 블록에서 제어 하는 시스템 리소스를 가져옵니다.Declares the beginning of a Using block and optionally acquires the system resources that the block controls.

구문Syntax

Using { resourcelist | resourceexpression }  
    [ statements ]  
End Using  

요소Parts

용어Term 정의Definition
resourcelist 를 제공 resourceexpression하지 않는 경우 필수 사항입니다.Required if you do not supply resourceexpression. Using 블록이 제어 하는 하나 이상의 시스템 리소스 목록으로, 쉼표로 구분 합니다.List of one or more system resources that this Using block controls, separated by commas.
resourceexpression 를 제공 resourcelist하지 않는 경우 필수 사항입니다.Required if you do not supply resourcelist. Using 블록에 의해 제어 되는 시스템 리소스를 참조 하는 참조 변수 또는 식입니다.Reference variable or expression referring to a system resource to be controlled by this Using block.
statements 선택 사항입니다.Optional. Using 블록이 실행 하는 문 블록입니다.Block of statements that the Using block runs.
End Using 필수 요소.Required. Using 블록의 정의를 종료 하 고 제어 하는 모든 리소스를 삭제 합니다.Terminates the definition of the Using block and disposes of all the resources that it controls.

resourcelist 파트의 각 리소스에는 다음과 같은 구문과 파트가 있습니다.Each resource in the resourcelist part has the following syntax and parts:

resourcename As New resourcetype [ ( [ arglist ] ) ]

또는-or-

resourcename As resourcetype = resourceexpression

resourcelist 파트resourcelist Parts

용어Term 정의Definition
resourcename 필수 요소.Required. 블록에서 Using 제어 하는 시스템 리소스를 참조 하는 참조 변수입니다.Reference variable that refers to a system resource that the Using block controls.
New 문이 리소스를 Using 획득 하는 경우에 필요 합니다.Required if the Using statement acquires the resource. 이미 리소스를 취득 한 경우 두 번째 구문 대체 방법을 사용 합니다.If you have already acquired the resource, use the second syntax alternative.
resourcetype 필수 요소.Required. 리소스의 클래스입니다.The class of the resource. 클래스는 인터페이스를 IDisposable 구현 해야 합니다.The class must implement the IDisposable interface.
arglist 선택 사항입니다.Optional. 인스턴스를 만들기 위해 생성자에 전달 하는 인수 목록입니다 resourcetype.List of arguments you are passing to the constructor to create an instance of resourcetype. 매개 변수 목록을 참조 하세요.See Parameter List.
resourceexpression 필수 요소.Required. resourcetype요구 사항을 충족 하는 시스템 리소스를 참조 하는 변수 또는 식입니다.Variable or expression referring to a system resource satisfying the requirements of resourcetype. 두 번째 구문 대체 방법을 사용 하는 경우 제어 Using 를 문에 전달 하기 전에 리소스를 가져와야 합니다.If you use the second syntax alternative, you must acquire the resource before passing control to the Using statement.

설명Remarks

코드에 파일 핸들, COM 래퍼 또는 SQL 연결과 같은 관리 되지 않는 리소스가 필요한 경우도 있습니다.Sometimes your code requires an unmanaged resource, such as a file handle, a COM wrapper, or a SQL connection. 블록 Using 은 코드가 완료 될 때 이러한 리소스를 하나 이상 삭제 하는 것을 보장 합니다.A Using block guarantees the disposal of one or more such resources when your code is finished with them. 이렇게 하면 다른 코드에서 사용할 수 있습니다.This makes them available for other code to use.

관리 되는 리소스는 추가 코딩 없이 GC (.NET Framework 가비지 수집기)에 의해 삭제 됩니다.Managed resources are disposed of by the .NET Framework garbage collector (GC) without any extra coding on your part. 관리 되는 리소스에 Using 대 한 블록이 필요 하지 않습니다.You do not need a Using block for managed resources. 그러나 가비지 수집기를 대기 하는 Using 대신 블록을 사용 하 여 관리 되는 리소스를 강제로 삭제할 수 있습니다.However, you can still use a Using block to force the disposal of a managed resource instead of waiting for the garbage collector.

블록 Using 은 획득, 사용 및 삭제의 세 부분으로 구성 됩니다.A Using block has three parts: acquisition, usage, and disposal.

  • 취득 은 변수를 만들고 초기화 하 여 시스템 리소스를 참조 하는 것을 의미 합니다.Acquisition means creating a variable and initializing it to refer to the system resource. 문은 하나 이상의 리소스를 얻거나 블록을 입력 하기 전에 정확히 하나의 리소스를 획득 한 후 Using 문에 제공할 수 있습니다. UsingThe Using statement can acquire one or more resources, or you can acquire exactly one resource before entering the block and supply it to the Using statement. 를 제공 resourceexpression하는 경우 Using 문에 제어를 전달 하기 전에 리소스를 얻어야 합니다.If you supply resourceexpression, you must acquire the resource before passing control to the Using statement.

  • 사용 은 리소스에 액세스 하 고 작업을 수행 하는 것을 의미 합니다.Usage means accessing the resources and performing actions with them. UsingEnd Using 사이의 문은 리소스의 사용을 나타냅니다.The statements between Using and End Using represent the usage of the resources.

  • 삭제 는의 Dispose resourcename개체에 대해 메서드를 호출 하는 것을 의미 합니다.Disposal means calling the Dispose method on the object in resourcename. 이렇게 하면 개체가 리소스를 완전히 종료할 수 있습니다.This allows the object to cleanly terminate its resources. End Using 문은 Using 블록의 컨트롤에 있는 리소스를 삭제 합니다.The End Using statement disposes of the resources under the Using block's control.

동작Behavior

Using 블록Try은 ... 블록에서 리소스 를Finally 사용 하 고 블록에서 리소스를 삭제 하는 구문입니다. Finally TryA Using block behaves like a Try...Finally construction in which the Try block uses the resources and the Finally block disposes of them. 따라서 블록을 종료 하 Using 는 방법에 관계 없이 블록은 리소스 삭제를 보장 합니다.Because of this, the Using block guarantees disposal of the resources, no matter how you exit the block. 이는를 StackOverflowException제외 하 고 처리 되지 않은 예외의 경우에도 마찬가지입니다.This is true even in the case of an unhandled exception, except for a StackOverflowException.

Using 문에 의해 획득 된 모든 리소스 변수의 범위는 Using 블록으로 제한 됩니다.The scope of every resource variable acquired by the Using statement is limited to the Using block.

Using 문에서 둘 이상의 시스템 리소스를 지정 하는 경우 다른 범위 내에 블록을 중첩 Using 한 것과 같은 결과가 나타납니다.If you specify more than one system resource in the Using statement, the effect is the same as if you nested Using blocks one within another.

가 이면에 대Dispose 한 호출이 수행 되지 않으며 예외가 throw 되지 않습니다. Nothing resourcenameIf resourcename is Nothing, no call to Dispose is made, and no exception is thrown.

Using 블록 내에서 구조적 예외 처리Structured Exception Handling Within a Using Block

Using 블록에서 발생할 수 있는 예외를 처리 해야 하는 경우 전체 Try를 추가할 수 있습니다. Finally 생성할 수 있습니다.If you need to handle an exception that might occur within the Using block, you can add a complete Try...Finally construction to it. Using 문이 리소스를 획득 하는 데 실패 한 경우를 처리 해야 하는 경우를 테스트 하 여 resourcename 가 인지 Nothing를 확인할 수 있습니다.If you need to handle the case where the Using statement is not successful in acquiring a resource, you can test to see if resourcename is Nothing.

Using 블록 대신 구조적 예외 처리Structured Exception Handling Instead of a Using Block

리소스 획득을 보다 세부적으로 제어 해야 하는 경우 또는 Finally 블록 Using 에 추가 코드가 필요한 경우 블록 Try을 ... Finally 생성.If you need finer control over the acquisition of the resources, or you need additional code in the Finally block, you can rewrite the Using block as a Try...Finally construction. 다음 예제에서는의 Try resource획득 및 Using 삭제에 해당 하는 해골 및 생성을 보여 줍니다.The following example shows skeleton Try and Using constructions that are equivalent in the acquisition and disposal of resource.

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 개체를 다른 변수에 할당 하면 안 됩니다.The code inside the Using block should not assign the object in resourcename to another variable. Using 블록을 종료 하면 리소스가 삭제 되 고 다른 변수는 가리키는 리소스에 액세스할 수 없습니다.When you exit the Using block, the resource is disposed, and the other variable cannot access the resource to which it points.

예제Example

다음 예에서는 .log 라는 파일을 만들고 두 줄의 텍스트를 파일에 씁니다.The following example creates a file that is named log.txt and writes two lines of text to the file. 또한이 예제에서는 동일한 파일을 읽고 텍스트 줄을 표시 합니다.The example also reads that same file and displays the lines of text.

TextWriter IDisposable 클래스는 인터페이스를 구현 하기 때문에 코드는 문을 Using 사용 하 여 쓰기 및 읽기 작업 후에 파일이 올바르게 닫혀 있는지 확인할 수 있습니다. TextReaderBecause the TextWriter and TextReader classes implement the IDisposable interface, the code can use Using statements to ensure that the file is correctly closed after the write and read operations.

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

참고자료See also