Оператор Using (Visual Basic)

Обновлен: Ноябрь 2007

Объявляет начало блока 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 состоит из трех частей: приобретение, использование и удаление.

  • 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 были вложены друг в друга.

Структурированная обработка исключений с помощью блока 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
' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Catch ex As Exception
    ' Insert code to process exception.
Finally 
    ' Insert code to do additional processing before disposing of resource.
    resource.Dispose()End Try
htd05whh.alert_note(ru-ru,VS.90).gifПримечание.

В коде внутри блока Using не следует присваивать объект в resourcename другой переменной. При выходе из блока Using ресурс будет удален, и другая переменная не сможет получить доступ к ресурсу, на которые она указывает.

Пример

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

Public Sub setbigbold(ByVal c As Control)
    Using nf As New System.Drawing.Font("Arial", 12.0F, _
        System.Drawing.FontStyle.Bold)

        c.Font = nf
        c.Text = "This is 12-point Arial bold"
    End Using
End Sub

См. также

Задачи

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

Ссылки

IDisposable

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

System.Drawing

Font