Instrução using (Referência de C#)

Fornece uma sintaxe conveniente que garante o uso correto dos IDisposable objetos.

Exemplo

O exemplo a seguir mostra como usar a instrução.

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

Comentários

Filee Font são exemplos de tipos gerenciados que acessam recursos não gerenciados (neste identificadores de arquivos de case e contextos de dispositivo). Há muitos outros tipos de recursos não gerenciados e tipos de biblioteca de classes que encapsulam-los. Todos os tipos de tais devem implementar a IDisposable interface.

Como regra, quando você usa um IDisposable de objeto, você deve declarar e instanciá-la em um using instrução. O using chamadas de instrução do Dispose método no objeto da maneira correta e (quando você usá-lo, conforme mostrado anteriormente) ele também faz com que o objeto em si para fora do escopo assim que Dispose é chamado. Dentro do using bloco, o objeto é somente leitura e não pode ser modificado ou reatribuída.

O using instrução garante que Dispose é chamado, mesmo se ocorre uma exceção enquanto você está chamando métodos no objeto. Você pode obter o mesmo resultado, colocando o objeto em um bloco try e depois chamar de Dispose em um bloco finally; Na verdade, isso é como o using instrução é traduzida pelo compilador. O exemplo de código anterior se expande para o seguinte código em tempo de compilação (Observe as chaves extra para criar o escopo limitado para o objeto):

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

Várias instâncias de um tipo podem ser declaradas em um using instrução, como mostrado no exemplo a seguir.

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Você pode instanciar o objeto de recurso e, em seguida, passar a variável para o using instrução, mas isso não é uma prática recomendada. Nesse caso, o objeto permanece no escopo depois que o controle saia do using bloquear, embora ele provavelmente não terá mais acesso a seus recursos não gerenciados. Em outras palavras, ele será não mais totalmente inicializado. Se você tentar usar o objeto fora do using bloquear, risco fazendo com que uma exceção seja lançada. Por esse motivo, é geralmente melhor instanciar o objeto na using instrução e limitar seu escopo para o using bloco.

            Font font2 = new Font("Arial", 10.0f);
            using (font2) // not recommended
            {
                // use font2
            }
            // font2 is still in scope 
            // but the method call throws an exception 
            float f = font2.GetHeight(); 

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

Palavras-chave C#

Diretiva using (Referência de C#)

Conceitos

Guia de Programação em C#

Implementando um método Dispose

Outros recursos

Referência de C#

Coleta de Lixo