Declaraciones de importación: palabra open clave
Una declaración de importación especifica un módulo o espacio de nombres cuyos elementos se pueden 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 puede crear código difícil de escribir, leer y mantener. En su lugar, puede usar la 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, pueda usar el formato corto del nombre en lugar del nombre open completo. Esta palabra clave es similar a la using palabra clave en C#, en Visual C++ using namespace y en Imports Visual Basic.
El módulo o espacio de nombres proporcionado debe estar en el mismo proyecto o en un ensamblado o proyecto 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, 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, módulo o archivo que lo contiene.
Cuando se usan varias declaraciones de importación, deben aparecer en líneas independientes.
El código siguiente muestra el uso de la palabra open clave para simplificar el 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 ni una advertencia cuando se producen ambigüedades cuando se produce el mismo nombre 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 , aunque se encuentra en los Seq.empty empty módulos y List Seq .
open List
open Seq
printfn %"{empty}"
Por lo tanto, tenga cuidado al abrir módulos o espacios de nombres como o que contengan miembros que tengan nombres idénticos; en su lugar, considere la posibilidad de usar List Seq 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 este:
open type System.Math
PI
Esto expondrá todos los campos estáticos y miembros accesibles en el tipo.
También puede definir tipos de unión discriminados y registros definidos por open 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 es posible que no quiera 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
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 que están abiertos de forma predeterminada.
| Espacio de nombres | Descripción |
|---|---|
FSharp.Core |
Contiene definiciones básicas de tipos de F# 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 las expresiones asincrónicas. |
FSharp.Text |
Contiene funciones para E/S con formato, como la printf función . |
Atributo AutoOpen
Puede aplicar el atributo a un ensamblado si desea abrir automáticamente un espacio de nombres o módulo cuando se hace AutoOpen referencia al ensamblado. También puede aplicar el atributo a un módulo para abrir automáticamente ese módulo cuando se abre el AutoOpen 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 con frecuencia, ayuda a evitar conflictos 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.