Gerenciamento de recursos: O uso de palavra-chave (F#)
Este tópico descreve a palavra-chave use e o using a função, que pode controlar a inicialização e o lançamento 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 os recursos de sistema operacional, como, por exemplo, os contextos de dispositivo de elementos gráficos, identificadores de arquivos, conexões de rede e o 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 da versão mais recente do recurso para o pool para que ele pode ser fornecido para outro aplicativo. Problemas ocorrem quando os aplicativos não liberar recursos de volta 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, o que libera corretamente recursos. 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. Há 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 sai 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."
Observação |
---|
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 Seqüê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 que deve ser descartado) torna-se um argumento, value, em function-or-lambda, que é tanto uma função que espera um único argumento restante de um tipo que corresponde ao valor produzida por expression1, ou uma expressão lambda que espera um argumento do tipo. No 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 não é tentada).
O exemplo a seguir demonstra a 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 maneiras 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 contendo. Em geral, você deve preferir usar use em vez da using função.