Dichiarazioni di importazione: parola chiave open (F#)
Una dichiarazione di importazione specifica un modulo o uno spazio dei nomi ai cui elementi è possibile fare riferimento senza utilizzare un nome completo.
open module-or-namespace-name
Note
Se si fa sempre riferimento al codice utilizzando il percorso completo dello spazio dei nomi o del modulo, il codice risultante potrebbe essere difficile da scrivere, leggere e gestire.È invece possibile utilizzare la parola chiave open per i moduli e gli spazi dei nomi utilizzati di frequente, in modo che quando si fa riferimento a un membro di tale modulo o spazio dei nomi è possibile utilizzare la forma abbreviata del nome anziché il nome completo.Questa parola chiave è simile alla parola chiave using in C#, a usingnamespace in Visual C++ e a Imports in Visual Basic.
Il modulo o lo spazio dei nomi fornito deve trovarsi nello stesso progetto o in un progetto o un assembly a cui si fa riferimento.In caso contrario, è possibile aggiungere un riferimento al progetto o utilizzare l'opzione della riga di comando -reference- o la relativa abbreviazione, -r.Per ulteriori informazioni, vedere Opzioni del compilatore (F#).
La dichiarazione di importazione rende disponibili i nomi nel codice che segue la dichiarazione, fino alla fine dello spazio dei nomi, del modulo o del file che la contiene.
Quando si utilizzano più dichiarazioni di importazione, queste devono trovarsi in righe distinte.
Nell'esempio di codice seguente viene illustrato l'utilizzo della parola chiave open per semplificare il codice.
// 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..."
Tramite il compilatore F# non viene generato un errore o un avviso in caso di ambiguità dovute alla presenza dello stesso nome in più di uno spazio dei nomi o modulo aperto.In caso di ambiguità, in F# viene data la preferenza allo spazio dei nomi o al modulo aperto più recentemente.Nel codice seguente, ad esempio, empty indica Seq.empty, anche se empty si trova in entrambi i moduli List e Seq.
open List
open Seq
printfn "%A" empty
Prestare pertanto attenzione quando si aprono moduli o spazi dei nomi, come List o Seq, contenenti membri con nomi identici. Prendere invece in considerazione l'utilizzo di nomi completi.Evitare qualsiasi situazione in cui il codice dipende dall'ordine delle dichiarazioni di importazione.
Spazi dei nomi aperti per impostazione predefinita
Alcuni spazi dei nomi vengono utilizzati talmente frequentemente nel codice F# che sono aperti in modo implicito senza che sia necessaria una dichiarazione di importazione esplicita.Nella tabella seguente sono illustrati gli spazi dei nomi aperti per impostazione predefinita.
Spazio dei nomi |
Descrizione |
---|---|
Microsoft.FSharp.Core |
Contiene le definizioni dei tipi F# di base per i tipi incorporati come int e float. |
Microsoft.FSharp.Core.Operators |
Contiene operazioni aritmetiche di base come + e *. |
Microsoft.FSharp.Collections |
Contiene classi di raccolte non modificabili come List e Array. |
Microsoft.FSharp.Control |
Contiene tipi per i costrutti di controllo come la valutazione differita e i flussi di lavoro asincroni. |
Microsoft.FSharp.Text |
Contiene funzioni per I/O formattato, come la funzione printf. |
Attributo AutoOpen
È possibile applicare l'attributo AutoOpen a un assembly se si desidera aprire automaticamente uno spazio dei nomi o un modulo quando viene fatto riferimento all'assembly.È anche possibile applicare l'attributo AutoOpen a un modulo per aprire automaticamente tale modulo quando viene aperto uno spazio dei nomi o un modulo padre.Per ulteriori informazioni, vedere Classe Core.AutoOpenAttribute (F#).
Attributo RequireQualifiedAccess
Alcuni moduli, i record o tipi di unione è possono specificare l'attributo RequireQualifiedAccess.Quando si fa riferimento a elementi di tali moduli, record o unioni, è necessario utilizzare un nome completo, indipendentemente dal fatto che potete includere una dichiarazione di importazione.Se si utilizza questo attributo strategicamente i nomi di tipi che definiscono comunemente utilizzati, consentono di evitare conflitti di nomi e in modo da rendere codice più resistenti alle modifiche apportate nelle librerie.Per ulteriori informazioni, vedere Classe Core.RequireQualifiedAccessAttribute (F#).