Поделиться через


Оператор 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.Дополнительные сведения см. в разделе Список параметров (Visual Basic).

resourceexpression

Обязательное.Переменная или выражение, которое ссылается на системный ресурс, отвечающий требованиям resourcetype.Если используется альтернативный синтаксис, необходимо получить ресурс перед передачей управления оператору Using.

Заметки

В некоторых случаях код требует неуправляемые ресурсы, такие как дескриптор файла, оболочка COM или SQL-соединение.Блок Using гарантирует удаление одного или более подобных ресурсов после завершения вашего кода, работающего с ними.Это делает их доступными для использования другим кодом.

Управляемые ресурсы удаляются с помощью сборщика мусора платформе .NET Framework (GC) без дополнительного кодирования.Для управляемых ресурсов блок Using необязателен.Тем не менее по-прежнему можно использовать блокUsing для принудительного удаления управляемого ресурса вместо того, чтобы ждать сборщика мусора.

Блок Using состоит из трех частей: приобретение, использование и удаление.

  • Acquisition означает создание переменной и инициализация ее для ссылки на ресурсы системы.Оператор Using может получить один или больше ресурсов либо может получить ровно один ресурс перед вводом блока и заданием его в операторе Using.Если указать resourceexpression, необходимо получить ресурс перед передачей управления оператору Using.

  • Usage означает получение доступа к ресурсам и выполнение над ними действий.Операторы между Using и End Using представляют собой использование ресурсов.

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

Поведение

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

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

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

Если resourcenameNothing, в 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 и записывает 2 линии текста в файл.В примере также читает, что один и тот же файл и отображает линии текста.

Поскольку классы 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

См. также

Задачи

Практическое руководство. Удаление системного ресурса (Visual Basic)

Ссылки

IDisposable

Оператор Try... Catch... Finally (Visual Basic)