Przestrzenie nazw

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).

Zewnętrzne aliasy

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


prev | Strona Główna | next

Copyright © 2006 Daniel Dusiński
Wszelkie prawa zastrzeżone