TOC

This article has been localized into Czech by the community.

Třídy:

Jmenné prostory (Namespace)

V jednom z prvních článků jsme se stručně dotkli tématu jmenných prostorů (namespaces). Pravděpodobně toto klíčové slovo poznáváte, protože se nachází ve většině souborů obsahujících kód C#, obvykle téměř na začátku. Jmenný prostor je v podstatě způsob, jak seskupit sadu typů, např. třídy, do pojmenovaného prostoru vlastního. Když Visual Studio generuje pro vás nový projekt, také generuje výchozí jmenný prostor, do kterého umístí váš první soubor (alespoň to platí pro typ projektu Console App). Může to vypadat takto:

using System;  

namespace MyProject  
{  
    class Program  
    {  
static void Main(string[] args)  
{  
// More code below this....

V tomto případě je jmenný prostor "MyProject" nyní součástí aplikace a při použití jeho tříd mimo něj budete muset název třídy prefixovat názvem jmenného prostoru. Přesně to samé vidíte, když chcete použít něco, co je hluboko zakopáno v .NET frameworku, jako toto:

System.IO.File.ReadAllText("test.txt");

V tomto případě používáme metodu ReadAllText() nalezenou ve třídě File, která existuje v jmenném prostoru System.IO namespace. Samozřejmě by bylo únavné psát tak dlouhý název pokaždé, když byste chtěli použít třídu ze jmenného prostoru, takže C# vám umožňuje "importovat" celý jmenný prostor do rozsahu vašeho souboru pomocí příkazu using. Opět je možné, že je již znáte, protože je obvykle můžete najít na začátku vašich souborů C#. Pro výše uvedený příklad, pokud bychom třídu File potřebovali více než jednou, by mělo smysl importovat jmenný prostor System.IO pomocí příkazu using, takto:

using System;
using System.IO;
// More using statements here...

Proč potřebujete jmenné prostory?

Pokud jste právě začali programovat, možná se ptáte, proč potřebujeme jmenné prostory. Proč prostě neumístit všechny vaše třídy do stejných jmenných prostorů, aby byly vždy přístupné? Máte platný bod, ale pouze pokud je váš projekt velmi malý. Jakmile začnete přidávat čím dál tím více tříd, má velký smysl oddělit je do jmenných prostorů. Jednoduše to usnadňuje hledání vašeho kódu, zvláště pokud umístíte vaše soubory do odpovídajících složek - ve skutečnosti, pokud přidáte do projektu složku a pak do ní přidáte třídu, Visual Studio ji automaticky umístí do odpovídajícího jmenného prostoru. Takže pokud vytvoříte v MyProject složku nazvanou MyFolder, třídy přidané do této složky budou ve výchozím nastavení umístěny ve jmenném prostoru nazvaném MyProject.MyFolder.

Skvělým příkladem, proč jsou jmenné prostory potřebné, je samotný .NET framework. Představte si, kdyby VŠECHNY třídy ve frameworku byly jen tak volně v globálním jmenném prostoru - byl by to zmatek! Místo toho je mají hezky organizované, se System jako kořenovým jmenným prostorem pro většinu tříd a pak pod-jmennými prostory jako System.IO pro věci související s vstupem/výstupem, System.Net pro věci související se sítí a System.Net.Mail pro věci související s poštou.

Konflikty názvů se jmennými prostory

Jak bylo zmíněno, jmenné prostory jsou zde také proto, aby vaše typy (obvykle třídy) byly zapouzdřené, takže mohou existovat ve své vlastním doméně. To také znamená, že máte svobodu vytvářet třídy se stejným názvem, jako jsou ty, které se nacházejí jinde ve vašem projektu nebo dokonce v .NET frameworku. Například byste se mohli rozhodnout, že potřebujete vlastní třídu File. Jak jsme viděli v předchozích příkladech, taková třída již existuje ve jmenném prostoru System.IO, ale máte svobodu vytvořit jednu ve svém vlastním jmenném prostoru, například takto:

using System;  

namespace MyProject.IO  
{  
    class File  
    {  
public static void HelloWorld()  
{  
    Console.WriteLine("Hello, world!");  
}  
    }  
}

Nyní, když ji chcete použít ve vašem projektu, například ve vaší hlavní metodě Program.cs (pokud pracujete na konzolové aplikaci, jako já), můžete buď napsat celý název:

MyProject.IO.File.HelloWorld();

Ale můžete také importovat jmenný prostor, stejně jako u jakéhokoli jiného jmenného prostoru (vestavěného nebo definovaného uživatelem), díky příkazu using. Zde je kompletnější příklad:

using System;
using MyProject.IO;

namespace MyProject
{
    class Program
    {
static void Main(string[] args)
{
    File.HelloWorld();
}
    }
}

Zatím dobré! Co když ale také chcete použít třídu File z jmenného prostoru System.IO? No, tady začínají potíže, protože pokud také importujete tento jmenný prostor pomocí příkazu using, kompilátor již neví, na kterou třídu File odkazujete - na naši vlastní nebo na tu ze jmenného prostoru System.IO. To lze vyřešit importem pouze jednoho ze jmenných prostorů (ideálně toho, ze kterého používáte nejvíce typů) a poté plným kvalifikováním názvu toho druhého, jako v tomto příkladu:

using System;
using System.IO;

namespace MyProject
{
    class Program
    {
static void Main(string[] args)
{
    MyProject.IO.File.HelloWorld();
}
    }
}

Ale je to trochu zdlouhavé psát pokaždé, obzvláště pokud je vaše třída ještě hlouběji vnořena do jmenných prostorů, např. MyProject.FileStuff.IO.File. Naštěstí má C# pro to řešení.

Použití Alias direktivy (směrnice)

Pro značné zkrácení názvu jmenného prostoru můžete importovat jmenný prostor pod jiným názvem pomocí direktivy Using Alias. Všimněte si, jak to dělám právě v následujícím příkladu:

using System;
using System.IO;
using MyIO = MyProject.IO;

namespace MyProject
{
    class Program
    {
static void Main(string[] args)
{
    File.ReadAllText("test.txt");
    MyIO.File.HelloWorld();
}
    }
}

Kouzlo se děje ve třetím řádku, kde importuji jmenný prostor MyProject.IO a dávám mu kratší název (MyIO), který pak můžeme použít, když chceme přistupovat k typům z něj. V tomto bodě neušetříme mnoho úderů kláves, ale opět byste si měli představit ještě delší názvy a úrovně jmenných prostorů a věřte mi, mohou být dost dlouhé a vnořené.

Shrnutí

Jmenné prostory vám dávají možnost zapouzdřit vaše typy do "pojmenovaných prostorů", což vám umožní získat lepší strukturu ve vašem kódu, stejně jako mít více tříd se stejným názvem, pokud existují v samostatných jmenných prostorech.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!