Vue d'ensemble
Similarités
Modules et namespaces permettent de :
Organiser le code en zones de fonctionnalités connexes
Éviter collision de noms
Différences
Compilation .NET
namespace
static class
Type
Top-level
Top-level ou local
Contient
Modules, Types
Idem + Valeurs, Fonctions
Annotable
❌ Non
✅ Oui
Portée : Namespaces > Fichiers > Modules
Utiliser un module ou un namespace
💡 Comme en C♯ :
Soit qualifier chaque élément du module/namespace utilisé
Soit tout importer avec
open
(placé en haut du fichier ou juste avant)En C♯ ≡
using
pour un namespaceEn C♯ ≡
using static
pour un module F♯ (équivalent d'une classe statique .NET)
Import : shadowing
L'import se fait sans conflit de nom mais en mode le dernier importé gagne i.e. masque un précédent élément importé de même nom
Exemple : ci-dessous, on a une erreur de compilation car la fonction add
qui est appelée est celle du module FloatHelper
!
☝ Conseil : pour tous les éléments qui ont des noms communs, propices au shadowing ‒ tels que
add
dans l'exemple précédent oumap
,filter
… des modulesList
,Seq
… ‒ il est conseillé de les appeler en les qualifiant, i.e. sans faire d'import de leur module.💡 Peut être rendu obligatoire en décorant le module avec
[<RequireQualifiedAccess>]
.
Mot cléglobal
Du fait du shadowing, on peut tomber sur des cas où l'on ne peut importer le bon namespace. Par exemple, ayant fait
open FsCheck
et ayant référencé la librairieFsCheck.Xunit
, lorsque l'on faitopen Xunit
, on importe non pas le namespaceXunit
de la librairieXunit
mais le namespaceFsCheck.Xunit
!💡 On se sort de cet imbroglio en faisant
open global.Xunit
.
Dernière mise à jour
Cet article vous a-t-il été utile ?