Compartilhar via


Gerenciamento de Recursos: a palavra-chave use

Este tópico descreve a palavra-chave use e a using função, que podem controlar a inicialização e a liberação de recursos.

Recursos

O recurso de termo é usado de mais de uma maneira. Sim, os recursos podem ser dados que um aplicativo usa, como cadeias de caracteres, gráficos e similares, mas, nesse contexto, os recursos se referem a recursos de software ou sistema operacional, como contextos de dispositivo gráfico, identificadores de arquivo, conexões de rede e banco de dados, objetos de simultaneidade, como identificadores de espera e assim por diante. O uso desses recursos por aplicativos envolve a aquisição do recurso do sistema operacional ou de outro provedor de recursos, seguido pela versão posterior do recurso para o pool para que ele possa ser fornecido a outro aplicativo. Problemas ocorrem quando os aplicativos não liberam recursos de volta para o pool comum.

Gerenciando recursos

Para gerenciar recursos com eficiência e responsabilidade em um aplicativo, você deve liberar recursos prontamente e de maneira previsível. O .NET Framework ajuda você a fazer isso fornecendo a System.IDisposable interface. Um tipo que implementa System.IDisposable tem o System.IDisposable.Dispose método, que libera corretamente os recursos. Aplicativos bem escritos garantem que System.IDisposable.Dispose isso é chamado prontamente quando qualquer objeto que contém um recurso limitado não é mais necessário. Felizmente, a maioria dos idiomas do .NET oferece suporte para facilitar isso, e F# não é exceção. Há dois constructos de linguagem úteis que dão suporte ao padrão de descarte: a use associação e a using função.

usar Associação

A use palavra-chave tem um formulário semelhante ao let da associação:

usarexpressãode valor =

Ele fornece a mesma funcionalidade que uma let associação, mas adiciona uma chamada ao Dispose valor quando o valor sai do escopo. Observe que o compilador insere uma verificação nula no valor, de modo que, se o valor for null, a chamada não Dispose será tentada.

O exemplo a seguir mostra como fechar um arquivo automaticamente usando a use palavra-chave.

open System.IO

let writetofile filename obj =
   use file1 = File.CreateText(filename)
   file1.WriteLine("{0}", obj.ToString() )
   // file1.Dispose() is called implicitly here.

writetofile "abc.txt" "Humpty Dumpty sat on a wall."

Várias instâncias são use descartadas na ordem inversa na qual são declaradas. Ou seja, o primeiro use será o último lançado.

Observação

Você pode usar use em expressões de computação, caso em que uma versão personalizada da use expressão é usada. Para obter mais informações, consulte Sequências, expressões assíncronas, expressões de tarefa e expressões de computação.

usando a função

A using função tem o seguinte formulário:

using (expression1) function-or-lambda

Em uma using expressão, expression1 cria o objeto que deve ser descartado. O resultado da expressão1 (o objeto que deve ser descartado) torna-se um argumento, valor, para função ou lambda, que é uma função que espera um único argumento restante de um tipo que corresponde ao valor produzido pela expressão1 ou uma expressão lambda que espera um argumento desse tipo. No final da execução da função, o runtime chama Dispose e libera os recursos (a menos que o valor seja null, nesse caso, a chamada para Dispose não é tentada).

O exemplo a seguir demonstra a using expressão com uma expressão lambda.

open System.IO

let writetofile2 filename obj =
    using (System.IO.File.CreateText(filename)) ( fun file1 ->
        file1.WriteLine("{0}", obj.ToString() )
    )

writetofile2 "abc2.txt" "The quick sly fox jumps over the lazy brown dog."

O exemplo a seguir mostra a using expressão com uma função.

let printToFile (file1 : System.IO.StreamWriter) =
    file1.WriteLine("Test output");

using (System.IO.File.CreateText("test.txt")) printToFile

Observe que a função pode ser uma função que já tem alguns argumentos aplicados. O exemplo de código a seguir demonstra isso. Ele cria um arquivo que contém a cadeia de caracteres XYZ.

let printToFile2 obj (file1 : System.IO.StreamWriter) =
    file1.WriteLine(obj.ToString())

using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")

A using função e a associação use são maneiras quase equivalentes de realizar a mesma coisa. A using palavra-chave fornece mais controle sobre quando Dispose é chamada. Quando você usa using, Dispose é chamado no final da função ou expressão lambda; quando você usa a use palavra-chave, Dispose é chamado no final do bloco de código que contém. Em geral, você deve preferir usar use em vez da using função.

Consulte também