Przestrzenie nazw pozwalają grupować powiązane ze sobą typy (a praktycznie cały program w C# jest zbiorem deklaracji typów). Różne przestrzenie nazw mogą się zagnieżdżać. Przestrzeń nazw deklarujemy używając słowa kluczowego namespace, np.
namespace Serverside { // Zamiast zagnieżdżania w sobie kolejnych deklaracji
namespace DD { // przestrzeni nazw możemy uzyskać ten sam efekt stosując
class Test { ... } // kropki w nazwie przestrzeni nazw. Np. aby uzyskać taki sam
} // efekt jak po lewej stronie, można zapisać :
} // namespace Serverside.DD { ... }
Pełna nazwa typu obejmuje także nazwę przestrzeni nazw, w której jest on zawarty. Tak więc aby odwołać się do klasy zadeklarowanej w powyższej przestrzeni nazw Serverside.DD powinniśmy użyć nazwy: Serverside.DD.Test
using : słowo kluczowe pozwalające uniknąć konieczności stosowania
pełnych nazw w stosunku do typów zawartych w innych przestrzeniach nazw, np.
using Serverside.DD;
spowoduje, że będzie można używać
wszystkich nazw zawartych w przestrzeni Serverside.DD bez konieczności
poprzedzania ich nazwą tej przestrzeni.
Ponadto dzięki using możemy określić zastępczą nazwę dla typu lub
przestrzeni nazw, np. using dd = Serverside.DD ;
Od tej pory bedzie można wpisywać dd zamiast Serverside.DD.
Najbardziej zewnętrzna przestrzeń nazw, w której zdefiniowane są wszystkie inne przestrzenie nazw, jest nazywana globalną przestrzenią nazw. Jeśli nie zadeklarujemy typu jawnie w przestrzeni nazw, to znajdzie się on w przestrzeni globalnej - będzie się można do niego odwoływać bezpośrednio z dowolnej innej przestrzeni nazw (aczkolwiek nie jest to w dobrym stylu programistycznym).
Przypuśćmy, że chcemy użyć w programie dwóch różnych wersji tej samej biblioteki. Prawdopodobnie znajdą się klasy, które w obu wersjach są umieszczone w tej samej przestrzeni nazw i posiadają te same nazwy. Odwołanie się do takiej klasy spowodowało by błąd (dla kompilatora obie klasy, ze starej i nowej biblioteki, są mają identyczne nazwy - oczywista dwuznaczność). Rozwiązaniem jest użycie zewnętrznych aliasów, np.
extern alias Curr; extern alias Old; class Test { Curr::NameSpc.MyClass a; // Klasa MyClass pochodząca z najnowszej Old::NameSpc.MyClass b; // ... i troche starszej biblioteki. }
Ponadto w momencie kompilacji musimy powiązać biblioteki z ich
aliasami. A zatem podajemy odpowiednie parametry dla kompilatora,
np. csc /r:Old=a1.dll /r:Curr:a2.dll test.cs