Declaraciones de importación: la palabra clave open

Una declaración de importación especifica un módulo o un espacio de nombres a cuyos elementos se puede hacer referencia sin usar un nombre completo.

Sintaxis

open module-or-namespace-name
open type type-name

Comentarios

La referencia al código mediante el espacio de nombres completo o la ruta de acceso del módulo cada vez puede crear código difícil de escribir, leer y mantener. En su lugar, puede usar la palabra clave open en los módulos y espacios de nombres usados con frecuencia de modo que, al hacer referencia a un miembro de ese módulo o espacio de nombres, pueda usar la forma abreviada del nombre en lugar del nombre completo. Esta palabra clave es similar a la palabra clave using de C#, using namespace de Visual C++ y Imports de Visual Basic.

El módulo o espacio de nombres proporcionado debe estar en el mismo proyecto o en un proyecto o ensamblado al que se hace referencia. Si no es así, puede agregar una referencia al proyecto o usar la opción de línea de comandos -reference (o su abreviatura, -r). Para obtener más información, consulte Opciones del compilador.

La declaración de importación hace que los nombres estén disponibles en el código que sigue a la declaración, hasta el final del espacio de nombres, el módulo o el archivo contenedor.

Al usar varias declaraciones de importación, deben aparecer en líneas independientes.

En el código siguiente se muestra el uso de la palabra clave open para simplificar código.

// Without the import declaration, you must include the full
// path to .NET Framework namespaces such as System.IO.
let writeToFile1 filename (text: string) =
  let stream1 = new System.IO.FileStream(filename, System.IO.FileMode.Create)
  let writer = new System.IO.StreamWriter(stream1)
  writer.WriteLine(text)

// Open a .NET Framework namespace.
open System.IO

// Now you do not have to include the full paths.
let writeToFile2 filename (text: string) =
  let stream1 = new FileStream(filename, FileMode.Create)
  let writer = new StreamWriter(stream1)
  writer.WriteLine(text)

writeToFile2 "file1.txt" "Testing..."

El compilador de F# no emite ningún error ni advertencia cuando se producen ambigüedades si el mismo nombre aparece en más de un módulo o espacio de nombres abierto. Cuando se producen ambigüedades, F# da preferencia al módulo o espacio de nombres abierto más recientemente. Por ejemplo, en el código siguiente, empty significa Seq.empty, aunque empty se encuentra en los módulos List y Seq.

open List
open Seq
printfn %"{empty}"

Por lo tanto, tenga cuidado al abrir módulos o espacios de nombres como List o Seq que contienen miembros con nombres idénticos; en su lugar, considere la posibilidad de usar los nombres completos. Debe evitar cualquier situación en la que el código dependa del orden de las declaraciones de importación.

Declaraciones de tipo abierto

F# admite open en un tipo como el siguiente:

open type System.Math
PI

Esto expone todos los campos estáticos y miembros accesibles en el tipo.

También puede abrir con open tipos de registros y uniones discriminadas definidos por F# para exponer miembros estáticos. En el caso de las uniones discriminadas, también puede exponer los casos de unión. Esto puede resultar útil para acceder a los casos de unión de un tipo declarado dentro de un módulo que es posible que no quiera abrir, así:

module M =
    type DU = A | B | C

    let someOtherFunction x = x + 1

// Open only the type inside the module
open type M.DU

printfn "%A" A

Espacios de nombres abiertos de manera predeterminada

Algunos espacios de nombres se usan con tanta frecuencia en el código de F# que se abren implícitamente sin necesidad de una declaración de importación explícita. En la tabla siguiente se muestran los espacios de nombres que se abren de manera predeterminada.

Espacio de nombres Descripción
FSharp.Core Contiene definiciones básicas de tipos de F# de tipos integrados, como int y float.
FSharp.Core.Operators Contiene operaciones aritméticas básicas, como + y *.
FSharp.Collections Contiene clases de colección inmutables, como List y Array.
FSharp.Control Contiene tipos de construcciones de control, como la evaluación diferida y las expresiones asincrónicas.
FSharp.Text Contiene funciones para E/S con formato, como printf.

Atributo AutoOpen

Puede aplicar el atributo AutoOpen a un ensamblado si quiere abrir automáticamente un espacio de nombres o un módulo cuando se haga referencia al ensamblado. También puede aplicar el atributo AutoOpen a un módulo para abrir automáticamente ese módulo cuando se abra el módulo o el espacio de nombres primario. Para obtener más información, vea AutoOpenAttribute.

RequireQualifiedAccess Attribute

Algunos módulos, registros o tipos de unión pueden especificar el atributo RequireQualifiedAccess. Al hacer referencia a elementos de esos módulos, registros o uniones, debe usar un nombre completo independientemente de si incluye una declaración de importación. Si usa este atributo estratégicamente en tipos que definen nombres usados habitualmente, ayuda a evitar colisiones de nombre y, por tanto, hace que el código sea más resistente a los cambios de las bibliotecas. Para obtener más información, vea RequireQualifiedAccessAttribute.

Vea también