Compartir a través de


Administración de recursos: palabra clave use (F#)

En este tema, se describen la palabra clave use y la función using, que permiten controlar la inicialización y la liberación de los recursos.

Recursos

El término recurso tiene varios significados. Puede hacer referencia a los datos utilizados por una aplicación, como cadenas y gráficos. En este contexto, sin embargo, el término recursos hace referencia a los recursos de software o del sistema operativo, como contextos de dispositivos gráficos, identificadores de archivos, conexiones de red y de base de datos, objetos de simultaneidad como identificadores de espera, etc. El uso de estos recursos por parte de las aplicaciones implica su obtención del sistema operativo u otro proveedor de recursos y, posteriormente, su liberación al grupo de recursos para que se puedan proporcionar a otra aplicación. Los problemas surgen cuando las aplicaciones no liberan los recursos al grupo común.

Administrar recursos

Para administrar de modo eficaz y responsable los recursos de una aplicación, es preciso liberarlos rápidamente y de manera predecible. .NET Framework ayuda a lograrlo mediante la interfaz IDisposable. Un tipo que implementa IDisposable tiene el método Dispose, que libera los recursos correctamente. Las aplicaciones bien programadas garantizan la rápida invocación de Dispose cuando ya no se necesita un objeto que tenga un recurso limitado. Afortunadamente, la mayoría de los lenguajes .NET, entre ellos F#, facilitan este procedimiento. Hay dos construcciones de lenguaje útiles que proporcionan el modelo de eliminación: el enlace use y la función using.

Enlace use

La palabra clave use tiene un formato similar al del enlace let:

use value = expression

Proporciona la misma funcionalidad que un enlace let pero agrega al valor una llamada a Dispose que se realizará cuando el valor salga del ámbito. Observe que el compilador inserta una comprobación de NULL en el valor de modo que, si el valor es null, no se intente realizar la llamada a Dispose.

En el ejemplo siguiente se muestra cómo cerrar un archivo automáticamente mediante la palabra clave use.

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

Se puede utilizar use en las expresiones de cálculo, en cuyo caso se utiliza una versión personalizada de la expresión use.Para obtener más información, vea Secuencias (F#), Flujos de trabajo asincrónicos (F#) y Expresiones de cálculo (F#).

Función using

La función using tiene este formato:

using (expression1) function-or-lambda

En una expresión using, expression1 crea el objeto que se debe eliminar. El resultado de expression1 (objeto que se debe eliminar) pasa a ser un argumento, value, de function-or-lambda, que es una función que espera un solo argumento restante de un tipo que coincide con el valor generado por expression1, o que es una expresión lambda que espera un argumento de ese tipo. Cuando la función termina de ejecutarse, el runtime llama a Dispose 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 expresión using 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 jumped over the lazy brown dog."

En el ejemplo siguiente se muestra la expresión using con una función.

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

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

Observe que la función podría tener aplicados ya algunos argumentos. En el siguiente ejemplo de código se muestra este caso. Se 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 función using y el enlace use son maneras casi equivalentes de lograr lo mismo. La palabra clave using proporciona mayor control sobre el momento en que se llama a Dispose. Cuando se utiliza using, se llama a Dispose al final de la función o expresión lambda; cuando se utiliza la palabra clave use, se llama a Dispose al final del bloque de código contenedor. En general, se debe dar preferencia a use en lugar de usar la función using.

Vea también

Referencia

IDisposable

Otros recursos

Referencia del lenguaje F#