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.
Declaraciones de importación: palabra
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.