Administración de recursos: palabra clave use
En este tema se describen la use palabra clave y la función , que pueden controlar la using inicialización y liberación de recursos.
Recursos
El término recurso se usa de más de una manera. Sí, los recursos pueden ser datos que usa una aplicación, como cadenas, gráficos y otros, pero en este contexto, los recursos se refieren a recursos de software o sistema operativo, como contextos de dispositivo gráfico, identificadores de archivos, conexiones de red y base de datos, objetos de simultaneidad como identificadores de espera, entre otros. El uso de estos recursos por parte de las aplicaciones implica la adquisición del recurso del sistema operativo u otro proveedor de recursos, seguido de la versión posterior del recurso en el grupo para que se pueda proporcionar a otra aplicación. Los problemas se producen cuando las aplicaciones no liberan recursos de vuelta al grupo común.
Administrar recursos
Para administrar de forma eficaz y responsable los recursos de una aplicación, debe liberar los recursos de forma rápida y predecible. El .NET Framework ayuda a hacerlo proporcionando la System.IDisposable interfaz . Un tipo que implementa System.IDisposable tiene el método , que libera System.IDisposable.Dispose correctamente los recursos. Las aplicaciones bien escritas garantizan que se llame rápidamente cuando ya no se necesite ningún objeto que contiene System.IDisposable.Dispose un recurso limitado. Afortunadamente, la mayoría de los lenguajes .NET proporcionan compatibilidad para facilitar esta tarea y F# no es una excepción. Hay dos construcciones de lenguaje útiles que admiten el patrón dispose: use el enlace y la función using .
usar enlace
La use palabra clave tiene un formato similar al del let enlace:
usar expresión de = valor
Proporciona la misma funcionalidad que un enlace, pero agrega una llamada a en let el valor cuando el valor sale del Dispose ámbito. Tenga en cuenta que el compilador inserta una comprobación null en el valor, de modo que si el valor es , no se intenta llamar null Dispose a .
En el ejemplo siguiente se muestra cómo cerrar un archivo automáticamente mediante la palabra use clave .
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."
Nota
Puede usar en expresiones de cálculo, en cuyo caso se usa una versión use personalizada use de la expresión. Para obtener más información, vea Sequences, Async expressions, Task expressionsy Computation Expressions.
using (Función)
La using función tiene el formato siguiente:
using (expression1) function-or-lambda
En una using expresión, expression1 crea el objeto que se debe eliminar. El resultado de expression1 (el objeto que se debe eliminar) se convierte en un argumento, valor , para function-or-lambda, que es una función que espera un único argumento restante de un tipo que coincide con el valor generado por expression1 o una expresión lambda que espera un argumento de ese tipo. Al final de la ejecución de la función, el tiempo de ejecución llama a y libera los recursos (a menos que el valor sea , en cuyo caso no se intenta llamar a Dispose null Dispose).
En el ejemplo siguiente se muestra la using expresión con una expresión 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."
En el ejemplo siguiente se muestra using la expresión con una función .
let printToFile (file1 : System.IO.StreamWriter) =
file1.WriteLine("Test output");
using (System.IO.File.CreateText("test.txt")) printToFile
Tenga en cuenta que la función podría ser una función que ya tenga algunos argumentos aplicados. El siguiente ejemplo de código muestra esto. Crea un archivo que contiene la cadena XYZ .
let printToFile2 obj (file1 : System.IO.StreamWriter) =
file1.WriteLine(obj.ToString())
using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")
La using función y el enlace son formas casi use equivalentes de realizar lo mismo. La using palabra clave proporciona más control sobre cuándo se llama a Dispose . Cuando se usa , se llama al final de la función o expresión lambda; cuando se usa la palabra clave , se llama al final del bloque using de código que lo Dispose use Dispose contiene. En general, debe preferir usar en use lugar de la función using .