Namespaces et imports
Notions théoriques
Pourquoi les namespaces ?
Un namespace (espace de noms) organise le code en groupes logiques et évite les conflits de noms. Deux classes peuvent s'appeler Produit si elles sont dans des namespaces différents.
namespace Boutique.Inventaire
{
class Produit { /* ... */ }
}
namespace Boutique.Ventes
{
class Produit { /* ... */ } // même nom, namespace différent — pas de conflit
}
Déclarer un namespace
Syntaxe historique (accolades) :
namespace MonProjet.Modeles
{
class Etudiant
{
public string Nom { get; set; } = "";
}
}
Syntaxe file-scoped (C# 10+, recommandée) :
namespace MonProjet.Modeles; // s'applique à tout le fichier — sans accolades
class Etudiant
{
public string Nom { get; set; } = "";
}
La syntaxe file-scoped (namespace MonProjet; sans accolades) est disponible depuis C# 10. Elle évite un niveau d'indentation pour tout le fichier. Les nouveaux projets utilisent systématiquement cette syntaxe.
using — importer un namespace
using permet d'utiliser les types d'un namespace sans écrire le chemin complet à chaque fois :
// Sans using : chemin complet obligatoire
System.Console.WriteLine("Bonjour");
System.Collections.Generic.List<string> liste = new System.Collections.Generic.List<string>();
// Avec using : nom court suffit
using System;
using System.Collections.Generic;
Console.WriteLine("Bonjour");
List<string> liste = new List<string>();
Namespaces courants de .NET
| Namespace | Contenu |
|---|---|
System | Types de base : Console, Math, Environment, DateTime... |
System.Collections.Generic | List<T>, Dictionary<K,V>, HashSet<T>... |
System.IO | File, Directory, StreamReader, StreamWriter... |
System.Linq | Méthodes LINQ : .Where(), .Select(), .OrderBy()... |
System.Text | StringBuilder, Encoding... |
System.Net.Http | HttpClient pour les appels HTTP |
ImplicitUsings — imports automatiques
Dans les projets .NET 6+, le .csproj contient <ImplicitUsings>enable</ImplicitUsings>. Cela active automatiquement les imports les plus courants — vous n'avez pas à les écrire dans chaque fichier :
<!-- Dans le .csproj -->
<ImplicitUsings>enable</ImplicitUsings>
Les namespaces suivants sont importés automatiquement pour les applications console :
SystemSystem.Collections.GenericSystem.IOSystem.LinqSystem.Threading.TasksSystem.Text
global using — imports globaux (C# 10+)
global using importe un namespace dans tous les fichiers du projet :
// Fichier GlobalUsings.cs (par convention)
global using System.Text.Json;
global using MonProjet.Modeles;
global using MonProjet.Services;
Alias pour éviter les conflits
Si deux namespaces contiennent une classe de même nom, utilisez un alias :
using BoutiqueModele = Boutique.Inventaire.Produit;
using VentesModele = Boutique.Ventes.Produit;
var produitStock = new BoutiqueModele();
var produitVente = new VentesModele();
Convention de nommage des namespaces
La convention officielle Microsoft est NomEntreprise.NomProduit.Fonctionnalite :
MonEntreprise.MonApplication.Modeles
MonEntreprise.MonApplication.Services
MonEntreprise.MonApplication.Utilitaires
En BTS SIO, on simplifie souvent : NomProjet.Modeles, NomProjet.Services.
Exemple pratique
// Fichier : Modeles/Etudiant.cs
namespace GestionScolaire.Modeles;
class Etudiant
{
public string Nom { get; set; } = "";
public double Note { get; set; }
public override string ToString() => $"{Nom} ({Note:F1}/20)";
}
// Fichier : Services/BulletinService.cs
namespace GestionScolaire.Services;
using GestionScolaire.Modeles;
class BulletinService
{
public static string Generer(Etudiant e)
{
string mention = e.Note switch
{
>= 16 => "Très bien",
>= 10 => "Passable",
_ => "Insuffisant",
};
return $"Bulletin : {e} — {mention}";
}
}
// Fichier : Program.cs (top-level, pas de namespace)
using GestionScolaire.Modeles;
using GestionScolaire.Services;
var alice = new Etudiant { Nom = "Alice", Note = 15.5 };
Console.WriteLine(BulletinService.Generer(alice));
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Vous allez organiser un projet multi-fichiers avec des namespaces.
Étape 1 — Structurer le projet
Dans un vrai projet, chaque classe est dans son propre fichier. Ici, on simule la structure avec des namespaces explicites dans un seul fichier.
La convention est : une classe par fichier, et le namespace correspond au chemin du dossier depuis la racine du projet. Modeles/Produit.cs → namespace GestionStock.Modeles;. Cela rend la navigation dans le code intuitive et est supporté par tous les IDE .NET.
Étape 2 — Importer et utiliser les namespaces
Importez le namespace du modèle dans le service.
N'importez que les namespaces dont vous avez réellement besoin dans chaque fichier. Des imports inutiles encombrent le code et peuvent créer des ambiguïtés si deux namespaces contiennent des types de même nom. Les IDE modernes signalent les imports inutilisés.
Étape 3 — Utiliser les services dans Program.cs
Assemblez les pièces en important les deux namespaces.
Par convention, Program.cs (le point d'entrée) n'a pas de namespace. Il importe les namespaces nécessaires et orchestre l'application. Cette séparation — Program.cs comme chef d'orchestre, les autres fichiers comme musiciens — est un pattern classique en .NET.