Spazi dei nomi (F#)
Uno spazio dei nomi consente di organizzare il codice in aree di funzionalità correlate, permettendo di associare un nome a un raggruppamento di elementi di programma.
namespace [parent-namespaces.]identifier
Note
Se si desidera inserire codice in uno spazio dei nomi, la prima dichiarazione nel file deve dichiarare lo spazio dei nomi. Il contenuto dell'intero file diventa quindi parte dello spazio dei nomi.
Gli spazi dei nomi non possono contenere direttamente valori e funzioni. I valori e le funzioni devono invece essere inclusi nei moduli e i moduli sono inclusi negli spazi dei nomi. Gli spazi dei nomi possono contenere tipi e moduli.
Gli spazi dei nomi possono essere dichiarati in modo esplicito con la parola chiave namespace o in modo implicito quando si dichiara un modulo. Per dichiarare uno spazio dei nomi in modo esplicito, utilizzare la parola chiave namespace seguita dal nome dello spazio dei nomi. Nell'esempio seguente viene illustrato un file di codice in cui viene dichiarato uno spazio dei nomi Widgets con un tipo e un modulo inclusi in tale spazio dei nomi.
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
Se l'intero contenuto del file è incluso in un modulo, è anche possibile dichiarare gli spazi dei nomi in modo implicito utilizzando la parola chiave module e fornendo il nuovo nome dello spazio dei nomi nel nome di modulo completo. Nell'esempio seguente viene illustrato un file di codice in cui vengono dichiarati uno spazio dei nomi Widgets e un modulo WidgetsModule che contiene una funzione.
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
Il codice seguente è equivalente a quello precedente, ma il modulo è costituito da una dichiarazione di modulo locale. In tal caso, lo spazio dei nomi deve trovarsi da solo su una riga.
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
Se nello stesso file è necessario più di un modulo in uno o più spazi dei nomi, è necessario utilizzare dichiarazioni di modulo locali. Quando si utilizzano dichiarazioni di modulo locali, non è possibile utilizzare lo spazio dei nomi qualificato nelle dichiarazioni di modulo. Nel codice seguente viene illustrato un file in cui sono presenti una dichiarazione di spazio dei nomi e due dichiarazioni di moduli locali. In questo caso, i moduli sono contenuti direttamente nello spazio dei nomi e non vi sono moduli creati in modo implicito con lo stesso nome del file. Qualsiasi altra parte del codice nel file, ad esempio l'associazione do, è nello spazio dei nomi ma non nei moduli interni, pertanto è necessario qualificare il membro di modulo widgetFunction utilizzando il nome del modulo.
namespace Widgets
module WidgetModule1 =
let widgetFunction x y =
printfn "Module1 %A %A" x y
module WidgetModule2 =
let widgetFunction x y =
printfn "Module2 %A %A" x y
module useWidgets =
do
WidgetModule1.widgetFunction 10 20
WidgetModule2.widgetFunction 5 6
Di seguito è riportato l'output di questo esempio.
Module1 10 20
Module2 5 6
Per ulteriori informazioni, vedere Moduli (F#).
Spazi dei nomi annidati
Quando si crea uno spazio dei nomi annidato, è necessario utilizzare un nome completo. In caso contrario, viene creato un nuovo spazio dei nomi di primo livello. Nelle dichiarazioni di spazio dei nomi il rientro viene ignorato.
Nell'esempio seguente viene illustrato come dichiarare uno spazio dei nomi annidato.
namespace Outer
// Full name: Outer.MyClass
type MyClass() =
member this.X(x) = x + 1
// Fully qualify any nested namespaces.
namespace Outer.Inner
// Full name: Outer.Inner.MyClass
type MyClass() =
member this.Prop1 = "X"
Spazi dei nomi in file e assembly
Gli spazi dei nomi possono estendersi in più file in un singolo progetto o compilazione. Il termine frammento di spazio dei nomi descrive la parte di uno spazio dei nomi inclusa in un file. Gli spazi dei nomi possono anche estendersi in più assembly. Lo spazio dei nomi System, ad esempio, include tutto il componente .NET Framework, che si estende in molti assembly e contiene numerosi spazi dei nomi annidati.
Spazio dei nomi globale
Lo spazio dei nomi global predefinito viene utilizzato per inserire nomi nello spazio dei nomi .NET di primo livello.
namespace global
type SomeType() =
member this.SomeMember = 0
È inoltre possibile utilizzare global per fare riferimento allo spazio dei nomi .NET di primo livello, ad esempio per risolvere conflitti di nomi con altri spazi dei nomi.
global.System.Console.WriteLine("Hello World!")