# Programmation C sharp/Les espaces de noms
## Définition

Un espace de nom regroupe plusieurs déclarations sous un même nom ajouté à ceux des éléments déclarés (classes, interfaces, espace de nom imbriqué).
Exemple :

## Utiliser les membres d'un espace de nom

Les classes définies à l'intérieur de cet espace de noms peuvent se faire référence par leur nom simple : ClasseUne, ClasseDeux.
Une classe membre d'un autre espace de nom ou d'aucun doit forcément utiliser le nom absolu des classes, c'est à dire : MesClasses.ClasseUne, MesClasses.ClasseDeux ou bien utiliser la directive using :
Exemple :
Équivaut à :
L'exemple du chapitre "Un premier programme" utilise déjà un espace de nom : la classe Console est définie dans l'espace de noms System.

## Imbrication des espaces de noms

L'imbrication des espaces de noms est possible :
Ou directement :

## Espace de noms en plusieurs parties

Plusieurs fichiers sources peuvent contribuer à ajouter des déclarations à un même espace de noms.
Exemple :
| | images.cs Classes de gestion des images dans l'espace de noms Exemple.Graphisme |
| using System; namespace Exemple.Graphisme { public class Image { ... } public class ImageBitmap : Image { ... } ... } ||
| | couleur.cs Classes de gestion des couleurs dans l'espace de noms Exemple.Graphisme |
| using System; namespace Exemple.Graphisme { public class Couleur { ... } public class ConversionCouleur { ... } ... } ||

## Alias d'espace de nom

Le mot clé using peut servir à assigner un autre nom (plus court en général) à un espace de nom.
Exemple :
Créer un alias d'espace de nom est également utile pour utiliser deux classes portant le même nom, situées dans deux espaces de nom différents.
Exemple :
Si l'instruction using est utilisée deux fois, le nom Ligne est ambigu, comme l'explique l'erreur produite par le compilateur :
Dans ce cas, on peut utiliser l'instruction using pour l'un des deux espaces de nom et utiliser le nom complet pour l'autre espace de nom :
Il est également possible de définir deux alias d'espace de nom afin d'abréger les références :

## Conflit de nom

Il est possible que le code source utilise des noms déjà utilisé comme espace de noms.
Dans l'exemple de code suivant, les noms System et Console font référence à des attributs de la classe Classe.
Il est toutefois possible d'utiliser System.Console en utilisant le préfixe global:: qui permet de spécifier que l'on accède à l'espace de nom racine de tous les autres (implicite par défaut) :

## Alias d'assemblages

Lorsqu'une application utilise des assemblages dont les noms de classes complets (espace de nom inclus) sont identiques (deux versions/implémentations d'une même classe), l'ambiguïté doit être résolue en utilisant des alias d'assemblages.
Pour utiliser deux versions d'une même classe définies dans les assemblages grid.dll (version 1.0, alias "GridV1") et grid20.dll (version 2.0, alias "GridV2"), il faut définir les alias à utiliser dans la ligne de commande de compilation :
| Windows | csc /r:GridV1=grid.dll /r:GridV2=grid20.dll ... |
| Linux (Mono) | gmsc -r:GridV1=grid.dll -r:GridV2=grid20.dll ... |
Cela crée les alias externes GridV1 et GridV2. Pour utiliser ces alias à partir d'un programme, il faut les référencer à l'aide du mot clé extern :
Ces deux instructions créent deux nouvelles racines d'espace de nom en plus de global :