Instrução Using (Visual Basic)

Declara o início de um Using bloco e, opcionalmente, adquire os recursos do sistema que o bloco controla.

Syntax

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Partes

Termo Definição
resourcelist Necessário se você não fornecer resourceexpression . Lista de um ou mais recursos do sistema que esse Using bloco controla, separados por vírgulas.
resourceexpression Necessário se você não fornecer resourcelist . Variável de referência ou expressão que se refere a um recurso do sistema a ser controlado por esse Using bloco.
statements Opcional. Bloco de instruções que o Using bloco executa.
End Using Obrigatórios. Encerra a definição do Using bloco e descarta todos os recursos que ele controla.

Cada recurso na parte resourcelist tem a seguinte sintaxe e partes:

resourcename As New resourcetype [ ( [ arglist ] ) ]

-ou-

resourcename As resourcetype = resourceexpression

Partes da lista de recursos

Termo Definição
resourcename Obrigatórios. Variável de referência que se refere a um recurso do sistema que o Using bloco controla.
New Necessário se a Using instrução adquirir o recurso. Se você já tiver adquirido o recurso, use a segunda alternativa de sintaxe.
resourcetype Obrigatórios. A classe do recurso. A classe deve implementar a IDisposable interface .
arglist Opcional. Lista de argumentos que você está passando para o construtor para criar uma instância do resourcetype . Consulte Lista de parâmetros.
resourceexpression Obrigatórios. Variável ou expressão que se refere a um recurso do sistema que satisfaz os requisitos de resourcetype . Se você usar a segunda alternativa de sintaxe, deverá adquirir o recurso antes de passar o controle para a Using instrução .

Comentários

Às vezes, seu código requer um recurso não SQL, como um handle de arquivo, um wrapper COM ou um SQL gerenciamento. Um Using bloco garante o descarte de um ou mais desses recursos quando seu código é concluído com eles. Isso os disponibiliza para uso de outro código.

Os recursos gerenciados são descartados pelo .NET Framework coletor de lixo (GC) sem nenhuma codificação extra de sua parte. Você não precisa de um Using bloco para recursos gerenciados. No entanto, você ainda pode usar um bloco para forçar o descarte de um recurso gerenciado em vez Using de aguardar o coletor de lixo.

Um Using bloco tem três partes: aquisição, uso e descarte.

  • Aquisição significa criar uma variável e inicializando-a para se referir ao recurso do sistema. A instrução pode adquirir um ou mais recursos ou você pode adquirir exatamente um recurso antes de inserir o bloco Using e fornece-lo à Using instrução . Se você fornecer resourceexpression , deverá adquirir o recurso antes de passar o controle para a Using instrução .

  • Uso significa acessar os recursos e executar ações com eles. As instruções entre Using e representam o uso dos End Using recursos.

  • Descarte significa chamar Dispose o método no objeto em resourcename . Isso permite que o objeto encente seus recursos corretamente. A End Using instrução descarta os recursos sob Using o controle do bloco.

Comportamento

Um bloco se comporta como uma construção ... na qual o bloco usa os Using recursos e o bloco os Try Finally Try Finally descarta. Por isso, o Using bloco garante o descarte dos recursos, independentemente de como você sai do bloco. Isso é verdadeiro mesmo no caso de uma exceção sem-trata, exceto para um StackOverflowException .

O escopo de cada variável de recurso adquirida pela Using instrução é limitado ao Using bloco .

Se você especificar mais de um recurso do sistema na instrução , o efeito será o mesmo que se você Using Using aninhado bloquear um dentro de outro.

Se resourcename for , nenhuma chamada a será feita e nenhuma Nothing Dispose exceção será lançada.

Tratamento de exceção estruturado dentro de um bloco using

Se você precisar lidar com uma exceção que pode ocorrer dentro do bloco, poderá adicionar Using uma construção completa ... a Try Finally ela. Se você precisar lidar com o caso em que a instrução não for bem-sucedida na aquisição de um recurso, poderá testar para ver Using se resourcename é Nothing .

Tratamento de exceção estruturado em vez de um bloco using

Se você precisar de um controle mais fino sobre a aquisição dos recursos ou precisar de código adicional no bloco, poderá reescrever o bloco Finally Using como uma Try Finally construção... . O exemplo a seguir mostra esqueleto Try Using e construções equivalentes na aquisição e descarte de 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

Observação

O código dentro do Using bloco não deve atribuir o objeto em a outra resourcename variável. Quando você sai do bloco, o recurso é descartado e a outra variável não pode acessar Using o recurso ao qual ele aponta.

Exemplo

O exemplo a seguir cria um arquivo chamado log.txt e grava duas linhas de texto no arquivo. O exemplo também lê esse mesmo arquivo e exibe as linhas de texto:

Como as classes e implementam a interface , o código pode usar instruções para garantir que o arquivo seja fechado corretamente após as TextWriter operações de gravação e TextReader IDisposable Using leitura.

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

Confira também