Zamknij komunikat

Nowy Office 2013
Do góry Skomentuj

18. Przestrzenie nazw (namespaces)

18. Przestrzenie nazw (namespaces)

Daniel Celeda
6 czerwca 2006
76 159
Odsłony
Daniel Celeda
6 czerwca 2006
76 159
Odsłony

Do tej pory używaliśmy przestrzeni nazw stworzonych na potrzeby platformy .NET. Przypomnijmy czym są owe przestrzenie.
Są to zbiory zdefiniowanych klas, pogrupowanych w pewnego rodzaju „paczki”. Grupujemy klasy po to aby łatwiej je odnaleźć w przyszłości oraz aby uniknąć konfliktów.
Odpowiednia hierarchia przestrzeni nazw pozwala na łatwe i szybkie odnajdywanie potrzebnych klas. Jeśli nasz program używałby klas opisujących rodzaje budynków, przestrzenie nazw mogły wyglądać następująco:

Budynki,
Budynki.Duze (zawierający klasy Zamek, Wieżowiec, Blok),
Budynki.Male (zawierająca klasy Lepianka, Domek).

Kiedy może pojawić się konflikt?
Wyobraźmy sobie, że mamy dwie różne klasy „Zamek”. Pierwsza definiuje zamek będący budynkiem, druga natomiast zamek błyskawiczny. Gdyby nie było przestrzeni nazw, poniższy kod nie określałby jednoznacznie o jaką klasę nam chodzi.

Zamek obiekt = new Zamek();

Dlatego należałoby umieści definicje tych klas w różnych przestrzeniach nazw np. „Budynki.Duze” oraz „Ubrania.Akcesoria”. Kod należałoby zmodyfikować na następująco:

Budynki.Duze.Zamek obiekt1 = new Budynki.Duze.Zamek();
Ubrania.Akcesoria.Zamek obiekt2 = new Ubrania.Akcesoria.Zamek();
 

Wbudowane przestrzenie nazw

.NET udostępnia nam ogromną ilość zdefiniowanych przestrzeni nazw wraz z klasami. Z najważniejszymi powinniśmy się zapoznać.
System – najważniejsza i najpowszechniejsza przestrzeń, definiuje podstawowe klasy oraz jest korzeniem wielu podrzędnych przestrzeni,
System.Collections – przechowuje klasy będące kolekcjami,
System.Data – obsługa operacji na danych, głównie do pracy z bazami danych,
System.Drawing – obsługa grafiki (rysowanie po ekranie),
System.IO – operacje wejścia/wyjścia, a więc np. operacje na plikach,
System.Web – klasy służące do tworzenia stron internetowych w technologii ASP.NET,
System.Windows.Forms – programowanie w Windows, a więc tworzenie okienek, przycisków itp.

Słowo kluczowe „using”

Do tej pory używaliśmy już niejednokrotnie klas zdefiniowanych w jakiejś przestrzeni nazw np. System.Console. Zgodzicie się na pewno ze mną, że ciągłe powtarzanie długiej nazwy przestrzeni jest niewygodne, szczególnie gdy często chcemy wypisywać tekst na ekranie. Czy nie wygodniej byłoby raz zadeklarować jakich przestrzeni używamy w naszej aplikacji i gdzie mają być szukane używane przez nas klasy (w jakiej przestrzeni)? Taki program wyglądałby tak:

namespace Przestrzenie
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Witam !");
            Console.ReadKey();
        }
    }
}

Jednak oczywiście nie zadziała. Jest jednak na to sposób. Po prostu wcześniej musimy zadeklarować jakich przestrzeni nazw używamy. Możemy tego dokonać z pomocą słowa „using” umieszczanego na samym początku naszego programu. Po słówku tym wypisujemy przestrzeń nazw, z której to klas będziemy chcieli używać.

using System;
 
namespace Przestrzenie
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Witam !");
            Console.ReadKey();
        }
    }
}

I oczekiwany wynik:

Możemy użyć „using” wielokrotnie, w przypadku gdy chcemy użyć kilku przestrzeni nazw.

using System;
using System.Collections;
 
namespace Przestrzenie
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Witam !");
            Console.ReadKey();
        }
    }
}

Przestrzeń System.Collections poznamy w następnych artykułach.

Tworzenie własnych (niestandardowych) przestrzeni nazw

Podczas tworzenia rozbudowanych aplikacji należy grupować klasy w przestrzenie nazw, czyli samemu tworzyć hierarchię przestrzeni. Proces ten warto dobrze przemyśleć zanim zaczniemy kodować, ponieważ pomoże to nam w przyszłości „zapanować” nad naszym programem i jego architekturą.
Napiszmy prosty program matematyczny, który zobrazuje nam to zagadnienie. Będziemy potrzebowali przestrzeni nazw:
- zawierającej definicje figur geometrycznych,
- zawierającej klasę główną naszej aplikacji.

Pierwszy krok to stworzenie nowej solucji i projektu.

Następny to zmiana nazwy pliku na KlasaGlowna.cs (automatycznie zmieni się nazwa klasy na KlasaGlowna).

Dodajemy nowy plik z klasą zawierającą definicje figur.

Zmodyfikujmy kod tego pliku, aby wyglądał następująco:

using DefinicjeFigur;
 
namespace Figury
{
    class KlasaGlowna
    {
        static void Main(string[] args)
        {
            Figura obiekt = new Figura();
        }
    }
}

Metodę „Main()” definiuje się tylko w jednej klasie, ponieważ program rozpoczyna swoje wykonanie od tej metody.

Zobacz również

Komentarze

Ten fragment kursu wygląda jak niedokończony albo mu czegoś brakuje w połowie - gdzie definicja klasy Figura() w klasie DefinicjeFigur.cs? Skoro wywołujemy ją w klasie KlasaGlowna.cs, to chyba wypadało by ją najpierw napisać? ;)
m010ch, 7 czerwca 2006, 22:48
Nikt się nie przyznaje do tekstu? Bo część związana z tworzeniem własnych przestrzeni nazw jest kompletnie absurdalnie napisana, niedokończona i nieprzydatna - odniesie się ktoś do tego?
m010ch, 15 czerwca 2006, 13:36
Witam. Faktycznie coś jest nie tak. Postaram się odnaleźć ten artykuł (kurs był pisany dawno temu) i sprawdzić, której części brakuje.
hlehle, 21 czerwca 2006, 02:45
Troche czasu minelo a tu dalej artykul jest nie dokonczony.
stet, 8 sierpnia 2006, 22:55
Będzie dokończony ten artykuł ??
Arcodes, 11 sierpnia 2006, 17:30
I kolejny rok minął a artykuł nadal nie ma zakończenia :(
Parn, 19 maja 2007, 22:34
I tak mija czas, a artykułu jak nie było, tak nie ma :[
Gibon, 25 czerwca 2007, 11:25
A nie można zamiast pojedynczego wywołania przestrzeni wywołać od razu np wszystkie. jakoś usaing namespace System albo jakoś tak?.
Sfinks, 11 lipca 2007, 12:26
nie trzeba uzywac w tym przypadku zadnego "using", bo to ta sama przestrzen nazw (Figury). Jezeli w pliku "DefinicjeFigur.cs" zostawimy "namespace Figury", a w klasie glownej uzyjemy innej przestrzeni nazw, wtedy potrzebne dopiero bedzie "using Figury;" ;) a co do samego tworzenia instancji klasy, to juz bylo w poprzednich rozdzialach- bedzie dokladnie tak samo.
Flamaster, 16 sierpnia 2007, 14:13
Dziwny ten rozdział. Napisane zostało: "Przestrzeń System.Collections poznamy w następnych artykułach.", a poznawaliśmy ją wcześniej - przy okazji kolekcji (co prawda pobieżnie, ale zawsze).
Kot-ek, 19 listopada 2007, 12:40
No tak. Czas leci a kursu nikt nie poprawia.Szkoda bo poprzednie części były naprawdę niezłe.
adambart84, 21 listopada 2007, 10:01
:(
Twist, 25 lipca 2008, 14:59
Niekończąca się opowieść
Petro136, 26 lipca 2008, 23:25
non comentos - uzupełni to ktoś w końcu ??
szofer777, 24 sierpnia 2008, 18:30
No by się przydało jak by to w końcu ktoś dokończył. Ale chyba na próżno piszemy nasze komentarze jak juz nikt ich i tak nie czyta już, poza nami..

sajmon, 28 grudnia 2008, 16:35
wyglada na to, ze te przestrzenie nazw to nic innego, jak pakiety z Javy. Dlatego zainteresowani moga sobie przejrzec co nieco o pakietach w Javie :) Co do zaimportowania od razu kilku przestrzeni nazw, to mozna sprobowac podejscia z Javy:
using System.*
 
W Javie polecenie:
import java.lang.*
 
spowoduje uzywanie w danym pliku wszystkich skladnikow pakietu java.lang lacznie z pakietami wchodzacymi w jego sklad. Mozliwe, ze polecenie:
using System.*
 
spowoduje to samo w C# (nie sprawdzalem). Wtedy za jednym zamachem mielibysmy uzyte przestrzenie System, System.Collections, System.Console itd.

sekla, 1 lutego 2009, 23:32
ten kurs jest na idealnej stronie - centrumxp
uosabia on wszystko co kojarzy mi sie z microsoftem
czyli ...tu zrobimy tak,tutaj troszke, ale teraz zrobimy co innego, a wy i tak musicie to wiedziec to se poszukajcie, aa taki bedzie standard bo nie umiemy lepiej a my wiemy najlepiej

eh, 21 sierpnia 2009, 14:38
Po 6 i pół roku nadal niedokończone.
krzys, 21 lutego 2013, 12:35
jak nie było tak nie ma, ciąg dalszy nie nastąpi
kot, 2 maja 2014, 14:38
wciąż nic
pies, 18 sierpnia 2014, 13:51
i po 9 latach, także nic :D
laki luk, 7 czerwca 2015, 21:57
i już chyba nie będzie...
Piter, 9 listopada 2017, 15:49

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.