Instrução Using (Visual Basic)
Declara o início de um bloco Using
e, opcionalmente, adquire os recursos do sistema que o bloco controla.
Sintaxe
Using { resourcelist | resourceexpression }
[ statements ]
End Using
Partes
Termo | Definição |
---|---|
resourcelist |
Obrigatório se você não fornecer resourceexpression . Lista de um ou mais recursos do sistema que este bloco Using controla, separados por vírgulas. |
resourceexpression |
Obrigatório se você não fornecer resourcelist . Variável ou expressão de referência referente a um recurso do sistema a ser controlado por este bloco Using . |
statements |
Opcional. Bloco de instruções que Using executa. |
End Using |
Obrigatórios. Encerra a definição do bloco Using e descarta todos os recursos que ele controla. |
Cada recurso na parte resourcelist
tem as seguintes 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 bloco Using controla. |
New |
Obrigatório se a instrução Using adquirir o recurso. Se você já adquiriu o recurso, use a segunda alternativa de sintaxe. |
resourcetype |
Obrigatórios. A classe do recurso. A classe precisa implementar a interface IDisposable. |
arglist |
Opcional. Lista de argumentos que você está passando para o construtor para criar uma instância de resourcetype . Consulte a Lista de parâmetros. |
resourceexpression |
Obrigatórios. Variável ou expressão referente a um recurso do sistema que atende aos requisitos de resourcetype . Se você usar a segunda alternativa de sintaxe, deverá adquirir o recurso antes de passar o controle para a instrução Using . |
Comentários
Às vezes, o código requer um recurso não gerenciado, como um identificador de arquivo, um wrapper COM ou uma conexão SQL. Um bloco Using
garante o descarte de um ou mais desses recursos quando o código for concluído com eles. Isso os disponibiliza para que outros códigos sejam usados.
Os recursos gerenciados são descartados pelo GC (coletor de lixo) do .NET Framework sem qualquer codificação extra de sua parte. Você não precisa de um bloco Using
para recursos gerenciados. No entanto, você ainda pode usar um bloco Using
para forçar o descarte de um recurso gerenciado em vez de aguardar o coletor de lixo.
Um bloco Using
tem três partes: aquisição, uso e descarte.
Aquisição significa criar uma variável e inicializá-la para fazer referência ao recurso do sistema. A instrução
Using
pode adquirir um ou mais recursos, ou você pode adquirir exatamente um recurso antes de inserir o bloco e fornecê-lo à instruçãoUsing
. Se você fornecerresourceexpression
, deverá adquirir o recurso antes de passar o controle para a instruçãoUsing
.Uso significa acessar os recursos e realizar ações com eles. As instruções entre
Using
eEnd Using
representam o uso dos recursos.Descarte significa chamar o método Dispose no objeto em
resourcename
. Isso permite que o objeto encerre os recursos de maneira limpa. A instruçãoEnd Using
descarta os recursos sob o controle do blocoUsing
.
Comportamento
Um bloco Using
se comporta como uma construção Try
...Finally
na qual Try
usa os recursos e Finally
os descarta. Por isso, o bloco Using
garante o descarte dos recursos, independentemente de como você sai dele. Isso é verdade mesmo no caso de uma exceção não tratada, exceto para StackOverflowException.
O escopo de cada variável de recurso adquirida pela instrução Using
é limitado ao bloco Using
.
Se você especificar mais de um recurso do sistema na instrução Using
, o efeito será o mesmo que se você aninhasse blocos Using
um dentro do outro.
Se resourcename
for Nothing
, nenhuma chamada para Dispose será feita e nenhuma exceção será lançada.
Manipulação de Exceções Estruturadas em um Bloco de Uso
Caso seja necessário tratar uma exceção que possa ocorrer dentro do bloco Using
, você pode adicionar uma construção Try
...Finally
completa a ele. Se você precisar lidar com o caso em que a instrução Using
não for bem-sucedida na aquisição de um recurso, poderá testar para ver se resourcename
é Nothing
.
Manipulação de Exceções Estruturadas em vez de um Bloco de Uso
Se você precisar de um controle mais preciso sobre a aquisição dos recursos ou precisar de código adicional no bloco Finally
, poderá reescrever Using
como uma construção Try
...Finally
. O exemplo a seguir mostra construções de esqueleto Try
e Using
que são equivalentes na aquisição e alienação 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 bloco Using
não deve atribuir o objeto resourcename
a outra variável. Quando você sai do bloco Using
, o recurso é descartado e a outra variável não pode acessar 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 TextWriter e TextReader implementam a interface IDisposable, o código pode usar instruções Using
para garantir que o arquivo seja fechado corretamente após as operações de gravação e 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