Оператор 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

Части списка ресурсов

Термин Определение
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 представляют использование ресурсов.

  • Удаление означает вызов Dispose метода объекта в resourcename. Это позволяет объекту чисто завершить свои ресурсы. Инструкция End Using удаляет ресурсы под контролем Using блока.

Поведение

Блок Using ведет себя как Tryконструкция ...Finally , в которой Try блок использует ресурсы и Finally блок удаляет их. Из-за этого блок гарантирует удаление ресурсов независимо от того, Using как вы выходите из блока. Это верно даже в случае необработанного исключения, за исключением StackOverflowException.

Область каждой переменной ресурсов, полученной Using инструкцией, ограничена блокомUsing.

Если в Using инструкции указано несколько системных ресурсов, то эффект совпадает с тем, что вложенные блоки вложены Using друг в друга.

Если resourcename это Nothingтак, вызов Dispose не выполняется, и исключение не возникает.

Структурированная обработка исключений в блоке using

Если вам нужно обработать исключение, которое может произойти в Using блоке, можно добавить в него полное Tryпостроение ...Finally . Если вам нужно обработать ситуацию, когда Using инструкция не выполнена успешно при получении ресурса, можно проверить, есть ли resourcenameNothing.

Структурированная обработка исключений вместо блока using

Если вам нужен более тонкий контроль над приобретением ресурсов, или вам нужен дополнительный код в блоке Finally , можно переписать Using блок как Tryконструкцию ...Finally . В следующем примере показаны скелет Try и Using конструкции, эквивалентные приобретению и удалению 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 в другой переменной. При выходе 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

См. также