Compartir vía


Declaraciones de importación: palabra open clave

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

Sintaxis

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

Observaciones

Hacer referencia al código mediante el espacio de nombres completo o la ruta de acceso del módulo cada vez que puede crear código difícil de escribir, leer y mantener. En su lugar, puede usar la open palabra clave para los módulos y espacios de nombres usados con frecuencia para que, al hacer referencia a un miembro de ese módulo o espacio de nombres, puede usar la forma abreviada del nombre en lugar del nombre completo. Esta palabra clave es similar a la using palabra clave en C#, using namespace en Visual C++y Imports en 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 -reference opción de línea de comandos (o su abreviatura, -r). Para obtener más información, vea 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 envolventes.

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

El código siguiente muestra el uso de la palabra clave para simplificar el open 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 un error o una advertencia cuando se producen ambigüedades cuando se produce el mismo nombre en más de un módulo abierto o espacio de nombres. 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, significa Seq.empty, empty aunque empty se encuentra en los List módulos 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 contengan miembros que tengan nombres idénticos; en su lugar, considere la posibilidad de usar los nombres calificados. Debe evitar cualquier situación en la que el código dependa del orden de las declaraciones de importación.

Declaraciones de tipos abiertos

F# admite open en un tipo como el siguiente:

open type System.Math
PI

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

También open puede escribir tipos de unión discriminados y registros definidos por F#para exponer miembros estáticos. En el caso de uniones discriminadas, también puede exponer los casos de unión. Esto puede ser útil para acceder a los casos de unión en un tipo declarado dentro de un módulo que puede no desea abrir, de la siguiente manera:

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

Abrir desde la ruta de acceso raíz solo con global el especificador

Módulos anidados como

module A =
    module B =
        ...

se puede abrir a través de

open A // opens A
open B // opens A.B

Para abrir solo los módulos completos o los espacios de nombres prefijos con el global especificador:

open global.A   // works
open global.B   // this now fails
open global.A.B // works

Espacios de nombres abiertos de forma 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 abiertos de forma predeterminada.

Namespace Descripción
FSharp.Core Contiene definiciones de tipos de F# básicas para 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 para construcciones de control como la evaluación diferida y expresiones asincrónicas.
FSharp.Text Contiene funciones para E/S con formato, como la printf función .

AutoOpen (atributo)

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

Atributo RequireQualifiedAccess

Algunos módulos, registros o tipos de unión pueden especificar el RequireQualifiedAccess atributo . 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 nombres y, por tanto, hace que el código sea más resistente a los cambios en las bibliotecas. Para obtener más información, vea RequireQualifiedAccessAttribute.

Consulte también