Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Declara o início de um Using
bloco e, opcionalmente, adquire os recursos do sistema que o bloco controla.
Sintaxe
Using { resourcelist | resourceexpression }
[ statements ]
End Using
Partes
Prazo | Definição |
---|---|
resourcelist |
Obrigató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 |
Obrigató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ório Encerra a definição do Using bloco e descarta todos os recursos que ele controla. |
Cada recurso na resourcelist
parte tem a seguinte sintaxe e partes:
resourcename As New resourcetype [ ( [ arglist ] ) ]
- ou -
resourcename As resourcetype = resourceexpression
Partes da lista de recursos
Prazo | Definição |
---|---|
resourcename |
Obrigatório Variável de referência que se refere a um recurso do sistema que o Using bloco controla. |
New |
Necessário se a instrução Using adquirir o recurso. Se você já adquiriu o recurso, use a segunda alternativa de sintaxe. |
resourcetype |
Obrigatório 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 de resourcetype . Consulte Lista de parâmetros. |
resourceexpression |
Obrigatório 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 instrução Using . |
Observações
Às vezes, seu código requer um recurso não gerenciado, como um identificador de arquivo, um wrapper COM ou uma conexão SQL. Um Using
bloco garante o descarte de um ou mais desses recursos quando seu código é 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 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 Using
bloco para forçar o descarte de um recurso gerenciado em vez 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 inicializá-la para se referir ao recurso do sistema. A
Using
instrução 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 aUsing
instrução.Uso significa acessar os recursos e executar ações com eles. As instruções entre
Using
eEnd Using
representam o uso dos recursos.Descarte significa chamar o Dispose método no objeto em
resourcename
. Isso permite que o objeto encerre seus recursos de forma limpa. AEnd Using
instrução descarta os recursos sob oUsing
controle do bloco.
Comportamento
Um Using
bloco se comporta como uma Try
construção...Finally
na qual o Try
bloco usa os recursos e o Finally
bloco os descarta. Por isso, o Using
bloco garante o descarte dos recursos, independentemente de você sair do bloco. Isso é verdadeiro mesmo no caso de uma exceção sem tratamento, exceto por um StackOverflowException.
O escopo de cada variável de recurso adquirida pela instrução Using
é limitado ao Using
bloco.
Se você especificar mais de um recurso do Using
sistema na instrução, o efeito será o mesmo que se você aninhar Using
blocos um dentro de outro.
Se resourcename
for Nothing
, nenhuma chamada será Dispose feita e nenhuma exceção será gerada.
Tratamento estruturado de exceções em um bloco de uso
Se você precisar lidar com uma exceção que possa ocorrer dentro do Using
bloco, poderá adicionar uma construção completa Try
...Finally
a ela. Se você precisar lidar com o caso em que a Using
instrução não é bem-sucedida na aquisição de um recurso, você pode testar para ver se resourcename
é Nothing
.
Tratamento de exceção estruturado em vez de um bloco de uso
Se você precisar de um controle mais fino sobre a aquisição dos recursos ou precisar de código adicional no Finally
bloco, poderá reescrever o Using
bloco como uma Try
construção...Finally
O exemplo a seguir mostra esqueleto Try
e Using
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 resourcename
a outra variável. Quando você sai do Using
bloco, 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ê o mesmo arquivo e exibe as linhas de texto:
Como as classes e TextReader as TextWriter classes implementam a IDisposable interface, o código pode usar Using
instruções 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