Jason. Cała informatyka w jednym miejscu!

"namespace" w języku C# to coś, co może się przydać w trakcie pracy zespołowej nad projektem. Są takie sytuacje, w których ktoś pomyśli tak samo jak Wy i nada identyczną nazwę klasie nad jaką pracuje, być może nieświadomie :O. Co wtedy? Opisuję już w środku!

"NAMESPACE" W JĘZYKU C# DZIAŁA PREWENCYJNIE

Spolszczony termin jaki się narodził wokół tego to "przestrzeń nazw", czyli słowo "namespace". Kontroluje ono ograniczenie zasięgu widoczności wszystkich konstrukcji jakie znajdą się wewnątrz niej. To może być klasa, ale także interfejs, struktura i wiele innych konstrukcji, popularnych lub mniej popularnych.

Ktoś może spytać "na grzyba to stosować, bo chyba nie dla szpanu?" :D. Ano w sytuacjach, w których może dojść do kolizji nazw na prostej drodze, w przypadku nadania tej samej nazwy klasie, strukturze, czemukolwiek innemu przez Was i przez jakąś inną osobę. Prościej rzecz ujmując, zaleca się stosowanie "namespace" w języku C# najczęściej jak tylko można (zwłaszcza w projektach opracowywanych przez grupę osób), kiedy istnieje wysokie prawdopodobieństwo nadania tej samej nazwy, jaką posłużył się (albo może się posłużyć) ktoś jeszcze.

JAK UTWORZYĆ PRZESTRZEŃ NAZW?

Przestrzeń nazw tworzy się bardzo podobnie do klasy. Wystarczy po słowie kluczowym "namespace" nadać unikalny identyfikator (stosując się do tych samych zaleceń w konwencji nazewniczej omawianych podczas tłumaczenia klas), otworzyć nawiasy klamrowe i wstawić pomiędzy nimi wszystko to, co ma występować w naszej przestrzeni nazw. Na przykład:

namespace MyNamespace
{
	public class MyClass
	{
		
	}
}

Już. To spowoduje, że klasa "MyClass" będzie funkcjonować wewnątrz przestrzeni nazw "MyNamespace". Innymi słowy, klasa jest częścią tej przestrzeni nazw i nie występuje już na zewnątrz. W praktyce oznacza to, że od teraz pełny jej identyfikator wygląda następująco:

MyNamespace.MyClass

i takiego też trzeba się trzymać, jeżeli nam nie w głowie stosowanie dyrektywy "using" (więcej poniżej). Jedynym wyjątkiem jaki nas od tego zwalnia jest sytuacja, w której używamy tego identyfikatora z innego miejsca w kodzie źródłowym, który TAKŻE należy do tej samej przestrzeni:

namespace MyNamespace
{
	public class MyClass
	{
		
	}
}

a jakiś drugi plik źródłowy wygląda tak, dla przykładu:

namespace MyNamespace
{
	public class Program
	{
		static void Main(string[] args)
		{
			MyClass mc = new MyClass();	// poprawne - pochodzenie od tej samej przestrzeni nazw
		}
	}
}
MAŁE UŁATWIENIE W ROZUMIENIU DLA "JAVOWCÓW"

Wciąż to dla Was niezrozumiałe? Spróbuję z takiej mańki. Jeśli jest tak, że znacie Javę do tego stopnia że niestraszne Wam pakiety, to "namespace" w języku C# działa jak taki swoisty pakiet (traktujcie to jako skrót myślowy, bo w gruncie rzeczy nie ładujemy plików źródłowych do pakietów w "CSharpie"). Nadajecie mu nazwę i wszystko co zostanie tam wepchnięte, to tam sobie siedzi i będzie wymagać podania pełnej nazwy zamieszczonej powyżej, oczywiście przy założeniu że zostało to zaprogramowane w powyższy sposób. Powinno być teraz odrobinę łatwiej zrozumieć z czym to się je ;).

PEŁNA NAZWA JEST NIEUNIKNIONA, ALE CZY NA PEWNO?

Od czasu, gdy dowolna konstrukcja znajdzie się w środku "namespace", mamy obowiązek każdorazowego podawania jej nazwy gdy chcemy z niej skorzystać w innym miejscu kodu źródłowego, występującego poza tą samą przestrzenią nazw. Chyba, że skorzystamy z dyrektywy "using". Tak, tej samej którą widzimy na samej górze w każdym nowo tworzonym programie, w stosunku do "System":

using System;

Tak więc podstawiając do naszego przykładu, gdyby klasa uruchomieniowa znajdowała się wówczas w innej przestrzeni nazw, moglibyśmy sobie zapisać tak:

using MyNamespace;

i wtedy korzystać z samej nazwy klasy już bez konieczności odwoływania się do przestrzeni nazw:

MyClass mc = new MyClass();

zamiast:

MyNamespace.MyClass mc = new MyNamespace.MyClass();

Myślę, że patrząc na różnicę w pisaniu, zdecydowana część z Was przynajmniej rozważy ułatwienie sobie życia i skorzystania z dyrektywy, aby "namespace" w języku C# nie dawał się tak we znaki z tą przedłużoną nazwą :).

DWIE KLASY O TAKIEJ SAMEJ NAZWIE Z DWÓCH RÓŻNYCH PRZESTRZENI NAZW

Moment. A pomyślał ktoś z Was, co w przypadku gdy musimy zawrzeć w kodzie dwie przestrzenie nazw, a w obu z nich skorzystać z klasy o tej samej nazwie? Mianowicie, chodzi mi o to:

namespace MyNamespaceA
{
	public class MyClass
	{
		
	}
}

i o to:

namespace MyNamespaceB
{
	public class MyClass
	{
		
	}
}

W chwili, kiedy napiszemy tak:

using MyNamespaceA;
using MyNamespaceB;

class Program
{
	static void Main(string[] args)
	{
		MyClass mc = new MyClass();	// błąd - skąd kompilator ma wiedzieć, którą wybrać z tych dwóch???
	}
}

dojdzie do wystąpienia tego samego problemu! Dlatego też musicie się zdecydować. Albo usuwacie skrót w pierwszej, albo w drugiej nazwie.

Przestrzeń nazw w języku C#

"namespace" czyli "przestrzeń nazw", to "opakowywanie" konstrukcji w dodatkową "warstwę" ochraniającą przed wystąpieniem kolizji nazw.


Na tym skończymy debaty. Czy "namespace" w języku C# powinno być używane? Moim zdaniem, jak najbardziej jako taka "warstwa ochronna" przed nieprzyjemnymi kolizjami nazw. To się może przytrafić zwłaszcza, gdy projekt nadzoruje ktoś jeszcze, niż tylko Wy sami. Przy prostych przypadkach, nawet takich jak punkt w dwuwymiarowym układzie współrzędnych, bądźcie pewni na 99%, że zarówno Wy jak i inna osoba z zespołu, nazwiecie klasę "Point", a nie "Donut" :D...

PODOBNE ARTYKUŁY