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

Объявляет начало Using блока и при необходимости получает системные ресурсы, которые блокируют элементы управления.Declares the beginning of a Using block and optionally acquires the system resources that the block controls.

СинтаксисSyntax

Using { resourcelist | resourceexpression }  
    [ statements ]  
End Using  

ЧастиParts

ТерминTerm ОпределениеDefinition
resourcelist Требуется, если не указан resourceexpression.Required if you do not supply resourceexpression. Список из одного или нескольких системных ресурсов, которые Using управляются этим блоком, разделенные запятыми.List of one or more system resources that this Using block controls, separated by commas.
resourceexpression Требуется, если не указан resourcelist.Required if you do not supply resourcelist. Ссылка на переменную или выражение, ссылающееся на системный ресурс, который Using должен управляться этим блоком.Reference variable or expression referring to a system resource to be controlled by this Using block.
statements Необязательный параметр.Optional. Блок операторов, Using выполняемых блоком.Block of statements that the Using block runs.
End Using Обязательный.Required. Завершает определение Using блока и уничтожает все ресурсы, которыми он управляет.Terminates the definition of the Using block and disposes of all the resources that it controls.

Каждый ресурс в resourcelist части имеет следующий синтаксис и части:Each resource in the resourcelist part has the following syntax and parts:

resourcename As New resourcetype [ ( [ arglist ] ) ]

-или--or-

resourcename As resourcetype = resourceexpression

ресаурцелист частиresourcelist Parts

ТерминTerm ОпределениеDefinition
resourcename Обязательный.Required. Ссылочная переменная, которая ссылается на системный ресурс, Using который контролируется блоком.Reference variable that refers to a system resource that the Using block controls.
New Требуется, Using если инструкция получает ресурс.Required if the Using statement acquires the resource. Если вы уже приобрели ресурс, используйте второй альтернативный синтаксис.If you have already acquired the resource, use the second syntax alternative.
resourcetype Обязательный.Required. Класс ресурса.The class of the resource. Класс должен реализовывать IDisposable интерфейс.The class must implement the IDisposable interface.
arglist Необязательный параметр.Optional. Список аргументов, передаваемый конструктору для создания экземпляра resourcetype.List of arguments you are passing to the constructor to create an instance of resourcetype. См. список параметров.See Parameter List.
resourceexpression Обязательный.Required. Переменная или выражение, ссылающееся на системный ресурс, удовлетворяющий требованиям resourcetype.Variable or expression referring to a system resource satisfying the requirements of resourcetype. Если используется второй альтернативный синтаксис, необходимо получить ресурс перед передачей управления Using оператору.If you use the second syntax alternative, you must acquire the resource before passing control to the Using statement.

ПримечанияRemarks

Иногда коду требуется неуправляемый ресурс, например файловый обработчик, оболочка COM или соединение SQL.Sometimes your code requires an unmanaged resource, such as a file handle, a COM wrapper, or a SQL connection. Using Блок гарантирует удаление одного или нескольких таких ресурсов при завершении кода с ними.A Using block guarantees the disposal of one or more such resources when your code is finished with them. Это делает их доступными для использования другим кодом.This makes them available for other code to use.

Управляемые ресурсы удаляются сборщиком мусора .NET Framework (GC) без дополнительного написания кода для вашей части.Managed resources are disposed of by the .NET Framework garbage collector (GC) without any extra coding on your part. Для управляемых ресурсов Using блок не требуется.You do not need a Using block for managed resources. Однако можно по-прежнему использовать Using блок для принудительного удаления управляемого ресурса вместо ожидания сборщика мусора.However, you can still use a Using block to force the disposal of a managed resource instead of waiting for the garbage collector.

Блок Using состоит из трех частей: приобретение, использование и утилизация.A Using block has three parts: acquisition, usage, and disposal.

  • Получение означает создание переменной и ее инициализацию для ссылки на системный ресурс.Acquisition means creating a variable and initializing it to refer to the system resource. Инструкция может получить один или несколько ресурсов, либо можно получить ровно один ресурс, прежде чем входить в блок и передать его Using в инструкцию. UsingThe Using statement can acquire one or more resources, or you can acquire exactly one resource before entering the block and supply it to the Using statement. При указании resourceexpressionнеобходимо получить ресурс перед передачей управления Using оператору.If you supply resourceexpression, you must acquire the resource before passing control to the Using statement.

  • Использование означает доступ к ресурсам и выполнение действий с ними.Usage means accessing the resources and performing actions with them. Операторы между Using и End Using представляют использование ресурсов.The statements between Using and End Using represent the usage of the resources.

  • Реализация означает вызов Dispose метода для объекта в resourcename.Disposal means calling the Dispose method on the object in resourcename. Это позволяет объекту очищать свои ресурсы.This allows the object to cleanly terminate its resources. Оператор уничтожает ресурсы Using под управлением блока. End UsingThe End Using statement disposes of the resources under the Using block's control.

ПоведениеBehavior

Блок ведет себя Tryподобно... Using конструкция, в Try которой блок Finally использует ресурсы, а блок удаляет их. FinallyA Using block behaves like a Try...Finally construction in which the Try block uses the resources and the Finally block disposes of them. По Using этой причине блок гарантирует освобождение ресурсов, независимо от того, как вы выйдете из блока.Because of this, the Using block guarantees disposal of the resources, no matter how you exit the block. Это справедливо даже в случае необработанного исключения, за исключением StackOverflowException.This is true even in the case of an unhandled exception, except for a StackOverflowException.

Область каждой переменной ресурса, полученной Using инструкцией, ограничена Using блоком.The scope of every resource variable acquired by the Using statement is limited to the Using block.

Если в Using инструкции указано более одного системного ресурса, то такой результат будет таким же, как если бы вложенные Using блоки совпадали друг с другом.If you specify more than one system resource in the Using statement, the effect is the same as if you nested Using blocks one within another.

Если resourcename имеет Nothingзначение, вызов Dispose не выполняется и исключение не создается.If resourcename is Nothing, no call to Dispose is made, and no exception is thrown.

Структурированная обработка исключений в блоке usingStructured Exception Handling Within a Using Block

Если необходимо выполнить обработку исключения, которое может возникнуть в Using блоке, можно добавить полный Try... Finally его создание.If you need to handle an exception that might occur within the Using block, you can add a complete Try...Finally construction to it. Если необходимо решить, когда Using инструкция не сможет получить ресурс, можно проверить, имеет ли resourcename это значение Nothing.If you need to handle the case where the Using statement is not successful in acquiring a resource, you can test to see if resourcename is Nothing.

Структурированная обработка исключений вместо блока usingStructured Exception Handling Instead of a Using Block

Если требуется более точный контроль за приобретением ресурсов или требуется дополнительный код в Finally блоке, можно Using переписать блок как Try... Finally создание.If you need finer control over the acquisition of the resources, or you need additional code in the Finally block, you can rewrite the Using block as a Try...Finally construction. В следующем примере показаны Try скелеты Using и конструкции, эквивалентные в приобретении и утилизации resource.The following example shows skeleton Try and Using constructions that are equivalent in the acquisition and disposal of 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 другую переменную.The code inside the Using block should not assign the object in resourcename to another variable. При выходе из Using блока ресурс удаляется, а другая переменная не может получить доступ к ресурсу, на который он указывает.When you exit the Using block, the resource is disposed, and the other variable cannot access the resource to which it points.

ПримерExample

В следующем примере создается файл с именем log. txt и в него записываются две строки текста.The following example creates a file that is named log.txt and writes two lines of text to the file. В этом примере также считывается тот же файл и отображаются строки текста.The example also reads that same file and displays the lines of text.

Поскольку классы TextReader IDisposable и реализуют интерфейс, код может использовать Using инструкции, чтобы убедиться, что файл правильно закрыт после операций записи и чтения. TextWriterBecause the TextWriter and TextReader classes implement the IDisposable interface, the code can use Using statements to ensure that the file is correctly closed after the write and read operations.

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

См. такжеSee also