Qual è la differenza tra uno spazio dei nomi e un modulo in F #?


85

Ho appena iniziato a imparare F # (con poca esperienza precedente con .NET) quindi perdonami per quella che probabilmente è una domanda molto semplice: qual è la differenza tra uno spazio dei nomi e un modulo in F #?

Grazie

Dave

Modifica: grazie per la risposta Brian. Questo è quello che volevo sapere. Solo un chiarimento: puoi anche aprire uno spazio dei nomi (simile all'istruzione using di C #)?


4
E un'altra nota, quando apri uno spazio dei nomi in F #, come System, hai accesso anche ai suoi spazi dei nomi secondari. Quindi in C #, se apri System, devi ancora scrivere "System.IO.File". In F # è possibile scrivere "IO.File". Trovo che questo renda il codice molto più bello.
MichaelGG

Risposte:


93

Uno spazio dei nomi è una cosa .Net, comune in molti linguaggi industriali, solo un modo per organizzare i framework ed evitare conflitti di denominazione tra le diverse librerie. Sia tu che io possiamo definire un tipo "Foo" e usarli entrambi in un progetto, a condizione che siano in spazi dei nomi diversi (ad esempio NS1.Foo e NS2.Foo). Gli spazi dei nomi in .Net contengono tipi.

Un moduloèuna cosa in F #, è grosso modo analogo a una "classe statica" ...èun'entità che può contenere valori e funzioni let-bound, così come tipi (nota che gli spazi dei nomi non possono contenere direttamente valori / funzioni, spazi dei nomi può contenere solo tipi, che a loro volta possono contenere valori e funzioni). È possibile fare riferimento alle cose all'interno di un modulo tramite "ModuleName.Thing", che è la stessa sintassi dei namespace, ma i moduli in F # possono anche essere 'aperti' per consentire un accesso non qualificato, ad es.

open ModuleName
...
Thing  // rather than ModuleName.Thing

(MODIFICA: anche gli spazi dei nomi possono essere aperti in modo simile, ma il fatto che i moduli possano contenere valori e funzioni rende l'apertura di un modulo più 'interessante', in quanto puoi concludere con valori e funzioni, ad esempio "cos", essendo nomi che puoi usare direttamente, mentre in altri linguaggi .Net dovresti sempre qualificarlo, ad esempio "Math.cos").

Se digiti il ​​codice al "livello superiore" in F #, questo codice va implicitamente in un modulo.

Spero che questo aiuti in qualche modo, è una domanda piuttosto aperta. :)


Non può essere completamente corretto. i moduli esistono anche in C #, vero ? : stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird

1
Bene, c'è un netmodule, che è una cosa .NET, e c'è un modulo F #, che è una cosa F #, e penso che VB forse abbia un costrutto di modulo e le classi sono 'moduli' nel senso generale dell'ingegneria del software ... Ma la domanda originale riguardava i moduli F #.
Brian

1
C'è un ottimo collegamento qui , che spiega la relazione tra un assembly e un modulo net: un singolo assembly potrebbe contenere 2 netmodules scritti in 2 lingue diverse.
Darius

2
Assomiglia a "usare statico" in C # 6
Bruno Garcia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.