Compartilhar via


Gerenciamento de recursos: a palavra-chave use (F#)

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

Recursos

O termo recurso é usado em mais de uma maneira. Sim, os recursos podem ser dados que usa um aplicativo, como, por exemplo, seqüências de caracteres, gráficos e assim por diante, mas nesse contexto, recursos refere-se ao software ou recursos de sistema operacional, como, por exemplo, os contextos de dispositivo de elementos gráficos, identificadores de arquivos, 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 outro provedor de recursos, seguido a versão mais recente do recurso para o pool para que ela pode ser fornecida para outro aplicativo. Problemas ocorrem quando os aplicativos não liberar recursos para o pool comum.

Gerenciamento de recursos

Com eficiência e responsabilidade gerenciar recursos em um aplicativo, você deve liberar recursos imediatamente e de maneira previsível. A.NET Framework ajuda você a fazer isso, fornecendo a IDisposable interface. Um tipo que implementa IDisposable tem o Dispose método, que libera os recursos corretamente. Aplicativos bem escritos garantem que Dispose é chamado imediatamente quando qualquer objeto que contém um recurso limitado não é mais necessária. Felizmente, a maioria.NET idiomas oferecem suporte para tornar isso mais fácil e F# não é exceção. Existem duas construções de linguagem úteis que suportam o padrão dispose: o use vinculação e a using função.

usar ligação

O use palavra-chave tem um formulário que é semelhante da let vinculação:

use value =expression

Ele fornece a mesma funcionalidade que um let de vinculação, mas adiciona uma chamada para Dispose o valor quando o valor fica fora do escopo. Observe que o compilador insere uma verificação null no valor, portanto, que, se o valor é null, a chamada para Dispose não é tentada.

O exemplo a seguir mostra como fechar um arquivo automaticamente, usando o 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."

Dica

Você pode usar use em expressões de cálculo, caso em que uma versão personalizada da use a expressão é usada.Para obter mais informações, consulte Sequências (F#), Fluxos de trabalho assíncronos (F#) e Expressões de computação (F#).

usando a função

O using função tem a seguinte forma:

using (expression1) function-or-lambda

Em um using a expressão, expression1 cria o objeto que deve ser descartado. O resultado de expression1 (o objeto deve ser descartado) torna-se um argumento, value, em function-or-lambda, que é tanto uma função que espera de um único restante argumento de um tipo que corresponde ao valor produzido por expression1, ou uma expressão lambda que espera um argumento desse tipo. Ao final da execução da função, o tempo de execução chama Dispose e libera os recursos (a menos que o valor é null, caso em que a chamada de Dispose é tentada não).

O exemplo a seguir demonstra o using a 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 jumped over the lazy brown dog."

O próximo exemplo mostra a using a 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 tem alguns argumentos aplicados já. O código a seguir mostra um exemplo disso: Ele cria um arquivo que contém a seqüência XYZ.

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

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

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

Consulte também

Referência

IDisposable

Outros recursos

Referência da linguagem F#