Оператор 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
инструкция не выполнена успешно при получении ресурса, можно проверить, есть ли resourcename
Nothing
.
Структурированная обработка исключений вместо блока 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