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♯ ≡
usingpour un namespaceEn C♯ ≡
using staticpour un module F♯ (équivalent d'une classe statique .NET)
⚠️ Attention : l'ordre des imports est pris en compte, de haut en bas. → Cela autorise le shadowing (cf. ci-dessous). → De ce fait, réordonner des imports dans un fichier existant peut faire échouer la compilation ! → Donc, même s'il est conseillé d'avoir les imports triés par ordre alphabétique, cela n'est pas toujours possible. Alors, il est conseillé de l'indiquer dans le code au moyen d'un commentaire.
☝️ Depuis F♯ 5, il existe le mot clé open type qui permet d'importer les éléments statiques d'un type.
→ Ne pas le confondre avec open appliqué à un module, même s'il y a une équivalence au niveau .NET.
🔗Infos complémentaires : Article du blog de compositional-IT, MSDN
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
⚠️ Peut créer des problèmes difficiles à comprendre ❗
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
adddans 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églobalDu fait du shadowing, on peut tomber sur des cas où l'on ne peut importer le bon namespace. Par exemple, ayant fait
open FsChecket ayant référencé la librairieFsCheck.Xunit, lorsque l'on faitopen Xunit, on importe non pas le namespaceXunitde la librairieXunitmais le namespaceFsCheck.Xunit!💡 On se sort de cet imbroglio en faisant
open global.Xunit.
Mis à jour
Ce contenu vous a-t-il été utile ?