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
블록은 Try
블록이 리소스를 사용하고 Finally
블록이 리소스를 삭제하는 Try
...Finally
구문처럼 동작합니다. 이로 인해 Using
블록은 블록을 종료하는 방법에 관계없이 리소스 폐기를 보장합니다. 이는 StackOverflowException을 제외하고 처리되지 않은 예외의 경우에도 마찬가지입니다.
Using
문으로 획득한 모든 리소스 변수의 범위는 Using
블록으로 제한됩니다.
Using
문에 둘 이상의 시스템 리소스를 지정하면 Using
블록을 다른 블록 내에 중첩한 것과 효과가 동일합니다.
resourcename
이 Nothing
인 경우 Dispose에 대한 호출이 수행되지 않으며 예외가 throw되지 않습니다.
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
' 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 및 TextReader 클래스는 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
참고 항목
.NET