18. Przestrzenie nazw (namespaces)

18. Przestrzenie nazw (namespaces)

 Daniel Celeda
Daniel Celeda
00:00
06.06.2006
22 komentarze
76772 wyświetlenia

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.

@STRONA@

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.


Spodobał Ci się ten artykuł? Podziel się z innymi!

Źródło:

Polecamy również w kategorii Kurs C#, cz. I

Komentarze

  • m010ch 22:48 07.06.2006

    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 13:36 15.06.2006

    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?

  • hlehle 02:45 21.06.2006

    Witam. Faktycznie coś jest nie tak. Postaram się odnaleźć ten artykuł (kurs był pisany dawno temu) i sprawdzić, której części brakuje.

  • stet 22:55 08.08.2006

    Troche czasu minelo a tu dalej artykul jest nie dokonczony.

  • Arcodes 17:30 11.08.2006

    Będzie dokończony ten artykuł ??

  • Parn 22:34 19.05.2007

    I kolejny rok minął a artykuł nadal nie ma zakończenia :(

  • Gibon 11:25 25.06.2007

    I tak mija czas, a artykułu jak nie było, tak nie ma :[

  • Sfinks 12:26 11.07.2007

    A nie można zamiast pojedynczego wywołania przestrzeni wywołać od razu np wszystkie. jakoś usaing namespace System albo jakoś tak?.

  • Flamaster 14:13 16.08.2007

    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.

  • Kot-ek 12:40 19.11.2007

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

  • adambart84 10:01 21.11.2007

    No tak. Czas leci a kursu nikt nie poprawia.Szkoda bo poprzednie części były naprawdę niezłe.

  • Twist 14:59 25.07.2008

    :(

  • Petro136 23:25 26.07.2008

    Niekończąca się opowieść

  • szofer777 18:30 24.08.2008

    non comentos - uzupełni to ktoś w końcu ??

  • sajmon 16:35 28.12.2008

    <p>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..</p>

  • sekla 23:32 01.02.2009

    <p>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:</p> <p>using System.*</p> <p> </p> <p>W Javie polecenie:</p> <p>import java.lang.*</p> <p> </p> <p>spowoduje uzywanie w danym pliku wszystkich skladnikow pakietu java.lang lacznie z pakietami wchodzacymi w jego sklad. Mozliwe, ze polecenie:</p> <p>using System.*</p> <p> </p> <p>spowoduje to samo w C# (nie sprawdzalem). Wtedy za jednym zamachem mielibysmy uzyte przestrzenie System, System.Collections, System.Console itd.</p>

  • eh 14:38 21.08.2009

    <p>ten kurs jest na idealnej stronie - centrumxp</p> <p>uosabia on wszystko co kojarzy mi sie z microsoftem</p> <p>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</p>

  • krzys 12:35 21.02.2013

    Po 6 i pół roku nadal niedokończone.

  • kot 14:38 02.05.2014

    jak nie było tak nie ma, ciąg dalszy nie nastąpi

  • pies 13:51 18.08.2014

    wciąż nic

  • laki luk 21:57 07.06.2015

    i po 9 latach, także nic :D

  • Piter 15:49 09.11.2017

    i już chyba nie będzie...

Skomentuj

Autor