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


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

Структурированная обработка исключений с помощью блока Using

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

Структурированная обработка исключений без использования блока 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.
Finally 
    resource.Dispose() 
End Try 

Примечание

В коде внутри блока 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

См. также

Задачи

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

Ссылки

IDisposable

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

System.Drawing

Font