2009-04-27 6 views
64

Je viens de commencer à apprendre F # (avec peu d'expérience préalable avec .NET) alors pardonnez-moi pour ce qui est probablement une question très simple: Quelle est la différence entre un espace de noms et un module en F #?Quelle est la différence entre un espace de noms et un module en F #?

Merci

Dave

Edit: Merci pour la réponse Brian. C'est ce que je voulais savoir. Juste une précision: pouvez-vous aussi ouvrir un espace de noms (similaire à C# using statement)?

+3

Et une note de plus, lorsque vous ouvrez un espace de noms en F #, comme System, vous avez également accès à ses sous-espaces de noms. Donc en C#, si vous ouvrez System, vous devez toujours écrire "System.IO.File". En F #, vous pouvez écrire "IO.File". Je trouve que cela rend le code beaucoup plus agréable. – MichaelGG

Répondre

78

Un espace de noms est une chose .Net, commune dans de nombreux langages industriels, juste un moyen d'organiser les frameworks et d'éviter les conflits de noms entre différentes bibliothèques. Vous et moi pouvons définir un type "Foo" et les utiliser tous les deux dans un projet, à condition qu'ils se trouvent dans des espaces de noms différents (par exemple NS1.Foo et NS2.Foo). Les espaces de noms dans .Net contiennent des types. Un module est une chose F #, il est à peu près analogue à une "classe statique" ... c'est une entité qui peut contenir des valeurs et des fonctions de let let, ainsi que des types (notez que les namespaces ne peuvent pas contenir directement des valeurs/fonctions, les espaces de noms ne peuvent contenir que des types, qui eux-mêmes peuvent contenir des valeurs et des fonctions). Les choses à l'intérieur d'un module peuvent être référencées via "ModuleName.Thing", qui est la même syntaxe que pour les espaces de noms, mais les modules de F # peuvent également être "ouverts" pour permettre un accès non qualifié, par ex.

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

(EDIT: Les espaces de noms peut également être ouvert de même, mais le fait que les modules peuvent contenir des valeurs et des fonctions permet l'ouverture d'un module plus « intéressant » dans la mesure où vous pouvez liquider avec des valeurs et des fonctions, par exemple « cos ", étant des noms que vous pouvez utiliser directement, alors que dans d'autres langages .Net vous devriez toujours le qualifier, par exemple" Math.cos ").

Si vous tapez du code au 'niveau supérieur' dans F #, ce code est implicitement placé dans un module.

Espérons que cela aide un peu, c'est une question assez ouverte. :)

+0

Cela ne peut pas être entièrement correct. les modules existent aussi en C#, n'est-ce pas?: http://stackoverflow.com/questions/645728/what-is-a-module-in-net –

+1

Eh bien, il y a un netmodule, qui est une chose .NET, et il y a un module F #, qui est une chose F #, et je pense que VB a peut-être une construction de module, et les classes sont des modules dans le sens général du génie logiciel ... Mais la question originale était sur les modules F #. – Brian

+1

Il y a un grand lien [ici] (http://blogs.msdn.com/b/junfeng/archive/2005/02/12/371683.aspx), qui explique la relation entre un assemblage et un module net - un seul L'assemblage peut contenir 2 netmodules écrits en 2 langues différentes. – Darius

Questions connexes