Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe la palabra clave use y la using función , que pueden controlar la inicialización y liberación de los recursos.
Recursos
El término recurso se usa de varias maneras. Sí, los recursos pueden ser datos que usa una aplicación, como cadenas, gráficos y similares, pero en este contexto, los recursos hacen referencia a recursos de software o sistema operativo, como contextos de dispositivos gráficos, identificadores de archivos, conexiones de red y base de datos, objetos de simultaneidad, como identificadores de espera, etc. El uso de estos recursos por aplicaciones implica la adquisición del recurso del sistema operativo u otro proveedor de recursos, seguido de la versión posterior del recurso al grupo para que se pueda proporcionar a otra aplicación. Los problemas se producen cuando las aplicaciones no liberan recursos de nuevo en el grupo común.
Administrar recursos
Para administrar los recursos de forma eficaz y responsable en una aplicación, debe liberar los recursos de forma rápida y predecible. .NET Framework le ayuda a hacerlo proporcionando la System.IDisposable interfaz . Un tipo que implementa System.IDisposable tiene el System.IDisposable.Dispose método , que libera correctamente los recursos. Las aplicaciones bien escritas garantizan que System.IDisposable.Dispose se llama rápidamente cuando ya no se necesita ningún objeto que contenga un recurso limitado. Afortunadamente, la mayoría de los lenguajes .NET proporcionan compatibilidad para facilitar esta tarea y F# no es ninguna excepción. Hay dos construcciones de lenguaje útiles que admiten el patrón dispose: el use enlace y la using función .
usar enlace
La use palabra clave tiene un formato similar al del let enlace:
usarexpresiónde valor =
Proporciona la misma funcionalidad que un let enlace, pero agrega una llamada al Dispose valor cuando el valor sale del ámbito. Tenga en cuenta que el compilador inserta una comprobación nula en el valor, de modo que, si el valor es null, no se intenta realizar la llamada a Dispose .
En el ejemplo siguiente se muestra cómo cerrar un archivo automáticamente mediante la use palabra 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."
Se eliminan varias instancias de use en el orden inverso en el que se declaran. Es decir, la primera use será la última publicada.
Nota:
Puede usar use en expresiones de cálculo, en cuyo caso se usa una versión personalizada de la use expresión. Para obtener más información, vea Secuencias, expresiones asincrónicas, expresiones de tarea y expresiones de cálculo.
using Function
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, en function-or-lambda, que es una función que espera un único argumento restante de un tipo que coincida 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 Dispose a y libera los recursos (a menos que el valor sea null, en cuyo caso no se intenta llamar a 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 la using 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 tiene algunos argumentos aplicados. En el ejemplo de código siguiente se 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 use enlace son casi formas equivalentes de lograr lo mismo. La using palabra clave proporciona más control sobre cuándo Dispose se llama a . Cuando se usa using, Dispose se llama al final de la función o expresión lambda; cuando se usa la use palabra clave , Dispose se llama al final del bloque de código contenedor. En general, debe preferir usar use en lugar de la using función .