Alias zde představuje nové jméno (tj. identifikátor) jmenného prostoru, resp. typu, které můžeme používat místo jména původního. Poznamenejme, že jméno typu musí být vyjádřeno identifikátorem, nikoli klíčovým slovem. To znamená, že takto nelze zavést nové jméno např. pro typ string. (Lze ovšem zavést nové jméno pro typ System.String a tak dosáhnout stejného výsledku; s tím jsme se setkali v oddílu 4.2.) PŘÍKLAD 5.6 | DEKLARACE USING Použijeme-li v příkladu z tohoto oddílu deklaraci using PD = První.Druhý;
vytvoříme alias PD, který lze používat místo První.Druhý. To znamená, že místo První.Druhý.U účko = new První.Druhý.U();
můžeme napsat PD.U účko = new PD.U();
5.4 Atributy Atributy24 byly v C# novinkou, jež neměla v žádném jiném z běžně používaných programovacích jazyků obdobu. Ovšem ukázalo se, že jde o velice užitečnou konstrukci, takže dnes najdeme jejich analogii (pod stejným nebo jiným označením) např. v C++ nebo v Javě. Atributy umožňují vyjádřit dodatečné informace o sestavení, modulu, třídě, metodě, její složce nebo o parametru metody; zapisují se do hranatých závorek před deklaraci. deklarace atributů: ◾◾ [ seznam_atributů ] Seznam atributů, to jsou jednotlivé atributy oddělené čárkami. Samotný atribut můžeme popsat takto: atribut: ◾◾ cílnep jméno ( parametrynep ) Atribut se implicitně vztahuje k následující deklaraci. Má-li se vztahovat k sestavení, musíme před ním jako cíl uvést assembly:, má-li se vztahovat k modulu,25 musíme před ním jako cíl uvést module:. Některé atributy lze aplikovat jen na některé cíle. Za jménem atributu mohou následovat v závorkách parametry. Podívejme se na příklad: [Serializable, Obsolete] public class Chacha { /* ... */ }
Zde jsme deklarovali třídu Chacha s atributy Serializable a Obsolete. K jejich významu se vrátíme v následujícím oddílu. Poznamenejme, že atributy obvykle zapisujeme na samostatnou řádku před deklaraci. 24 V OOP se termín atributy původně používal pro datové složky, případně obecně pro jakékoli složky tříd. V poslední době se ale začíná používat (alespoň v souvislosti s některými programovacími jazyky) ve významu dodatečný specifikátor. 25 Sestavení se může skládat z několika modulů, které mohou být překládány odděleně. Není to však běžný postup a my o něm v této knize nebudeme hovořit. 98 Programování v C#
Ukázka elektronické knihy, UID: KOS286763
5.4.1 Některé atributy Jazyk C# obsahuje řadu standardních atributů; my si zde řekneme jen o několika málo z nich. Vedle toho umožňuje C# definovat své vlastní atributy. Toto téma však přesahuje rámec naší knihy. Serializable Atribut Serializable říká, že třídu, strukturu, výčtový typ nebo delegát, na který je aplikován, lze serializovat (ukládat do souborů). Obsolete Atribut Obsolete říká, že cíl, na který se vztahuje, je zastaralý a programátoři by ho neměli používat. Překladač při použití tohoto cíle vypíše varování. Conditional Atribut Conditional(symbol) je definován ve jmenném prostoru System.Diagnostics a je určen pro ladění. Lze ho použít pouze na metodu typu void. Překladač vypustí všechna volání této metody, není-li pomocí direktivy #define definován symbol.26 Podívejme se na příklad: public class Příklad { [Conditional("LADÍM“)] public void Sleduj(int n) { System.Console.WriteLine("n = {0}", n); } public int Faktoriál(int n) // Faktoriál, to tu už dlouho { // nebylo int s = 1; while(n > 1) { s = s*n--; // Při ladění potřebujeme sledovat Sleduj(s); // změny hodnoty proměnné s } return s; } }
Bude-li definován symbol LADÍM, bude metoda Faktoriál() průběžně vypisovat hodnoty proměnné s. Po odstranění direktivy #define tyto výpisy zmizí. Tento příklad najdete na WWW v souboru 05\ladění\ladění.cs. Poznamenejme, že využívá naši knihovnu Vstup.dll.
26 Znáte-li jazyk C nebo C++, jistě si vzpomenete na podmíněný překlad pomocí direktiv #if a #endif. Smysl atributu Conditional je podobný, jeho výhodou ale je, že podmíněnost specifikujeme jen na jednom místě.
Začínáme naostro 99
Ukázka elektronické knihy, UID: KOS286763
6
Proměnné a datové typy
V této kapitole se krátce zastavíme u deklarace proměnných v jazyce C# a pak si řekneme nejdůležitější informace o třídě System.Object. Dále se budeme věnovat číselným a logickým datovým typům, výčtovým typům a uspořádaným n-ticím.
6.1 Proměnné Proměnná je, jak víme, pojmenované místo v paměti s určeným typem. Může jít o proměnnou deklarovanou v těle metody (tzv. lokální proměnnou), o formální parametr metody či o statickou nebo nestatickou datovou složku. Deklarace lokální proměnné má tvar deklarace proměnné: ◾◾ typ seznam_deklarátorů ; ◾◾ const typ seznam_deklarátorů ; ◾◾ readonly typ seznam_deklarátorů ; Typ je typ proměnných zaváděných touto deklarací; může být vyjádřen některým z klíčových slov (např. int), identifikátorem třídy nebo některou ze složitějších konstrukcí, které poznáme později. Seznam deklarátorů jsou jednotlivé deklarátory oddělené čárkami. Deklarátor je identifikátor deklarované proměnné, za kterým může následovat inicializace: deklarátor: ◾◾ identifikátor ◾◾ identifikátor = výraz Hodnota výrazu představuje počáteční hodnotu proměnné. V případě konstanty to musí být konstantní výraz, tj. výraz, který lze vypočítat už v době překladu. Jestliže v deklaraci uvedeme modifikátor const, deklarujeme tím konstantu, tedy proměnnou, jejíž hodnotu nebudeme moci měnit. Modifikátor readonly má podobný význam, lze ho však použít pouze v deklaraci datové složky třídy; vrátíme se k němu později, v 9. kapitole.
6.1.1 Deklarace s klíčovým slovem var Jestliže deklarujeme lokální proměnnou a inicializujeme ji, můžeme jméno typu nahradit klíčovým slovem var, které překladači říká: „Tato proměnná je stejného typu jako výraz, kterým ji inicializujeme. Dosaď tedy tento typ na místo slova var.“ To znamená, že var i = 8;
v těle metody představuje deklaraci lokální proměnné i typu int.
100 Programování v C# Ukázka elektronické knihy