jazyk c# - webgarden.cz50f8646375469... · web viewkolekce – předdefinované třídy, obecné...
TRANSCRIPT
Jazyk C# je blízký jazyku Java vytvořen na míru pro dot.net je integrován do Visual studio Dotnet rozlišuje velká a malá písmena je objektově orientovaný obsahuje nativní podporu komponentového programování podporuje jednoduchou dědičnost s možností násobné implementace rozhraní vedle členských dat a metod přidává vlastnosti a události správa paměti je automatická o destrukci objektů se stará Garbage Collector podporuje zpracování chyb pomocí výjimek zajišťuje typovou bezpečnost a podporuje řízení verzí podporuje atributové programování zajišťuje zpětnou kompatibilitu se stávajícím kódem na binární i zdrojové úrovni
Základní tematické okruhy základní vlastnosti – direktivity, jmenné prostory typový systém – hodnotové a referenční typy třídy – atributy a metody pole – pole a kolekce rozhraní – implementace a kombinace rozhraní výrazy a příkazy – operátory podmínky a cykly – if, else, switch, while, for vyjímky – try, catch, finally… kolekce – předdefinované třídy, obecné rozhraní události a delegáti – event…. Atributy a metadata - //…
Základní vlastnostiJmenný prostor
Značí se jako namespace Sdružuje související třídy a další typy Patří do něj kód uveený ve složených závorkách Pomocí using se nadefunje jmenný prostor
Direktivy Procesor umožňuje provádět podmíněný překlad pomocí zdvojeného kódu programu #define #undef #if #endif #elif #else #region – ignorová procesorem, slouží ke zpřehlednění kódu #endregion - ignorová procesorem, slouží ke zpřehlednění kódu
Typový systém = CTS Dvě hlavní kategorie, hodnotové a referenční typy
Hodnotové typy Instancí hodnotového typu jsou proměnné, které jsou ukládány do zásobníku
programu Obsahují pouze hodnotu daného typu bez dalších informací Nepodporují dědičnost Nedá se odvodit typ
Datové typy Celočíselné: byte, sbyte, short, unshort, int, uint, long, ulong Znakové: char Reálné: float a double
Decimální: decimal Logické: bool
Referenční typy Neuchovávají hodnotu, ale jen odkaz na paměťové místo Mohou nabývat hodnotu null Alokovány operátorem new Hodnoty se předávají odkazem Typy: object, string, class, interface, array, delegate
Neúplné typy Umožňují implementaci rozdělit do několika samostatných souborů Jsou deklarovány pomocí typového modifikátoru Musí být umístěny ve stejném jmenném prostoru jako ostatní rozdělené části Uživatelský kód může být oddělen od generovaného kódu, což zabraňuje nástrojům
v přepisu uživatelských změn Umožňuje práci více programátorů na jednom kódu v reálném čase Umožňuje dělit větší implementace Možné ulehčení údržby a opravy změn ve zdrojovém kódu Využitím neúplných typů se nijak neovlivní spustitelný kód Soubory definující jeden typ jsou spojeny až při překladu a nelze je později
jakýmkoliv způsobem rozšířit či modifikovat Nepovolují stejné deklarace proměnných v různých částech
Modifikátor partial není povolen pro deklarace delegátů a objektů typu enum
TřídyČleny tříd
Atributy = proměnné udržující stav objektu Metody = procedury a funkce implementující služby objektem poskytované Vlastnost = je označována za chytrou položku (vypadá jako položka, ale kontroluje
přístup k jednotlivým datům) Události – umožňují komunikaci s okolím objektu
Viditelnost členů Public – viditelné bez omezení Private – přístupné pouze v rámci třídy Protected – přístupné pouze v rámci třídy a potomkům třídy Internal – viditelnost v rámci assembly
Metody tříd Nejsou součástí objektu Jsou alokovány jen jedenkrát Společné pro všechny instance třídy
Charakteristika metody Má jméno Má návratovou hodnotu Libovolný počet parametrů Má určenou viditelnost
Přetížené metody Liší se v počtu nebo typu parametrů Lze je rozlišovat dle návratové hodnoty
Virtuální metody Podporují polymorfismus Lze překrýt metodou potomka
Parametry metod Jsou předávány do metody hodnotou Funkce získá kopii skutečných parametrů a jakékoliv modifikace uvnitř těla metody
se nepromítnou zpět
Předání parametru odkazem Metoda se nevytváří vlastní kopii, modifikuje přímo proměnnou, která jí byla předána Takové parametry označujeme klíčový slovem ref
Definice výstupního parametru Parametry označujeme klíčovým slovem out Parametry pak přenášejí své hodnoty směrem ven z metody
Vlastnosti Na venek se chovají jako veřejné položky třídy Interně jsou tvořeny množinou metod realizujících čtení a zápis vlastností Při deklaraci přístupových práv je nutno dodržet: vnitřní změna práv může být uveden
jen u jedné z operací a musí být vždy více restriktivní
Dědičnost a polymorfismus Odvozené třídy dědičností obsahují všechna data a metody tříd základních Užívá se pouze jednoduchá dědičnost Dědičnost se vyjádří dvojtečkou uvedenou za jménem třídy a názvem základní třídy Chceme-li předefinovat veřejnou metodu třídy, kterou dědíme, musíme užít klíčové
slovo new Pro realizaci polymorfismu užijeme virtuální metody
Postup polymorfismu: metodu základní třídy označíme jako virtuální (klíčové slovo virtual) a metodu odvozené třídě označíme klíčovým slovem override (má se chovat polymorfně)
Modifikátory tříd Z abstraktních tříd nevzniká instance (objekt) Z abstraktních tříd pouze dědí potomci
Modifikátor sealed Tímto modifikátorem označená třída již nelze dále rozšiřovat Případný řetězec dědičnosti končí touto třídou Při aplikaci na metodu či vlastnost stanovujeme, že daný člen třídy již nemůže být
předefinován Metoda, kterou takto chceme označit musí být virtuální a musí být předefinovaná Modifikátor musí být kombinován s overrite
Modifikátor abstrakt Lze aplikovat na metody a třídy Označená třída je implicitně virtuální
Statické třídy Neexistují u nich členské metody ani členská data Musí být odvozeny od třídy objekt Rozšiřují existujíc vzor CDCLASS o statické členy Je deklarována klíčový slovem static Zabrání založení instancí a dědičnosti Zabrání užití členských metod a dat
Pole a kolekcePole
Pole jsou třídy odvozené od mateřské třídy Systém.Array Chápeme jako množinu proměnných stejného datového typu S polem pracujeme jako s celkem Na jednotlivé proměnné pole se odkazujeme pomocí indexů pole a poté s nimi
pracujeme jako s obyčejnými proměnnými Každý počáteční prvek pole má index 0 Druhy: jednorozměrná, vícerozměrná, vícerozměrná nepravidelná
Deklarace Vytvoření instancí pole pomocí statické metody Systém.Array.CreateInstance()
Označení typu provedeme hranatou závorkou
kolekce Jsou standartní datové struktury doplňující pole Je jediná vestavěná datová struktura v jazyce Obecné rozhraní jež definuje standardizovanou sadu vzorů pro návrh kolekce
Konkrétní třídy implementují jako rozhraní
Rozhraní Umožňuje třídám přidat jisté charakteristiky nebo schopnosti nezávislé na hierarchii
tříd
Implementace rozhraní Začíná klíčovým slovem interface, po kterém následuje jeho jméno Ve složených závorkách je pak tělo rozhraní, které může obsahovat výčet metod (jen
hlavička metody bez těla), vlastnosti indexerů a událostí V rozhraní jsou všechny členy automaticky veřejné – publick Lez říci, že rozhraní je abstraktní třída jejíž metody jsou abstraktní
Třída může implementovat několik rozraní Rozhraní leze rozšiřovat a kombinovat pomocí dědičnosti
Operátory Množina operátorů je až na pár výjimek identická s operátory v jiných jazycích Definice operátorů je vždy statická a veřejná a pak následuje návratový typ
(libovolný)
Klíčové slovo operator přetěžuje operátor op Přetěžujeme-li unární operátor, definujeme jediný parametr, pro binární jsou
parametry dva a na tyto parametry nejsou kladena žádná omezení Je vhodné, aby první parametr byl stejného typu jako třída, jejíž operátor přetěžujeme Základní operátory:
Specifické operátory Typeof – slouží k reflexi a vrací instanci třídy Systém.Tipe. Sizeof – slouží ke zjištění velikosti hodnotových typů (tato operace je považována za
nebezpečnou, proto musí tento operátor být umístěn v bloku unsafe) Is – zjistí, zda je prvek instancí třídy As – provádí přetypování na jiný typ ?? – porovnává objekty a vrací hodnotu, která není NULL :: - omezení na lokální nebo globální namespace
Přetěžované operátory
Uživatelsky definované konverze Slouží ke konverzi třídy nebo struktury do jiné třídy Typ, pro který je konverze definována musí být definován v parametru, nebo musí
konverze tento typ vracet Definice musí být veřejná a statická Implicitní – jsou provádšny bez nutnosti zadání čehokoliv uživatelem Explicitní – uživatel musí zadat, že che provést konverzi
Výrazy a příkazy Příkaz je krok v cestě algoritmu Příkazy se provádějí většinou v pořadí zápisu a některé se musí ukončovat středníkem Blok označíme symboly {a} a dovnitř bloku můžeme vložit další příkazy popřípadě
blok Prázdný příkaz se vyjadřuje pomocí dvojice složených závorek bez obsahu Prázdný příkaz lze též zadat středníkem Deklarace lokální proměnné nebo lokální konstanty je považována za příkaz, lze je
užívat až do konce bloku Výrazový příkaz – vznikne připojením středníku a musí měnit proměnou, vlastnost
atd.
Podmínky (podmíněné příkazy)If
Má stejnou syntaxi jako v Java
Switch Používáme pro testování více vstupních podmínek
Return Vrací řízení volající funkci Může být spojen i s hodnotou, pokud volající metoda má jinou návratovou hodnotu
nežli void
Throw Slouží k vyvolání vyjímky Uplatní se při ošetření části kódu
CyklyWhile a do-while
Jako v Java
For a forearch Jako u java Forearch prochází všechny prvky pole či kontejneru
Skokové příkazy Brak – způsobí vyskočení z aktuálního cyklu nebo switche Goto – přesouvá provádění instrukcí na místo dané návěštím (viz Assembler), nelze
skočit dovnitř blokového příkazu Continue
Výjimky Pokud program narazí na neočekávaný problém, tak se objeví vyjímka Je odvozena od třídy objekt
Umožněna definice vlastních typů výjimek Přehled výjimek:
Lze vyvolat příkazem throw
Delegáty a anonymní metodyDelegát
Delegát je odkaz na metodu, který umožňuje sdílet změny mezi objekty Nahrazuje procedurální typ pinter Hlavním využitím delegátu je definic událostí
Definuje se pomocí klíčového slova delegate (public delegate void MujDelegat(string nejaky_parametr) )
Delegát musí být interně spojen s celou množinou metod K instanci delegáta lze připojit dalšího delegáta a to pomocí operátoru += nebo + Vrací-li delegát neprázdný návratový typ, pak je vrácena hodnota posledního delegáta Delegát lze odebrat pomocí operátorů -= nebo –
Anonymní metody Umožňují psát kód delegátu přímo inline Využít je lze v místě kódu, kde jsou očekávány delegáty popřípadě delegáty
s argumenty
Vlastnosti Možnost vypuštění seznamu parametr při definici delegáta, pokud tento seznam
nevyužíváme Využití lokálních proměnných, kterou jsou definovány v těle metody v níž je
anonymní metoda umístěna Z anonymní metody můžeme přistupovat k lokálním proměnným a parametrům,
takovým proměnným říkáme vnější (outer) proměnné anonymních metod
Pravidla určující návratovou metodu Návratový typ a seznam parametrů delegáta musí být kompatibilní s anonymní
metodou ještě před tím, než dojde k implicitní konverzi na delegátský typ delegáta
Seznam parametrů delegáta je kompatibilní s anonymní metodou když: Anonymní metoda nedefinuje seznam parametrů a delegát nemá žádné out parametry Pro anonymní metodu definovanou společně se seznamem parametrů platí, že seznam
parametrů musí přesně odpovídat parametrům delegáta. Seznam tedy musí mít stejný počet, typ a modifikátory parametrů jako parametry delegáta
Návratový typ delegáta je kompatibilní s anonymní metodou kdy: Návratový typ delegáta je void a metoda neobsahuje žádný příkaz return nebo
obsahuje tento příkaz bez výrazu Návratový typ delegáte není void, ale všechny výrazy v metodě vázané s příkazem
return mohou být implicitně přetypovány na návratový typ delegáta
Události Zpracování událostí je proces, kdy jeden objekt dokáže upozornit další objekty na to,
že došlo k nějaké změně stavu události Systém událostí interně využívá delegátů Delegát musí mít dva parametry a oba jsou objekty První parametr udává zdroj události Druhý parametr obsahuje informace spojené s konkrétní události (tento objekt musí
rozšiřovat třídu EventArgs Pokud chceme doplnit informace o probíhající události, musíme definovat třídu
dodatečných argumentů událostí
Vyvolání události Pokud druhý člen nabývá hodnoty NULL, tak to znamená, že si tuto událost žádná
jiná třída (než třída dodatečných argumentů) tzv. nepředplatila => nebude na tuto událost nikterak reagovat
Je dobrépřed vyvoláním události zkontrolovat, zda druhý člen nenabývá hodnoty NULL
Tím, že jsme ve třídě deklarovali událost, je možné k ní přistupovat jako ke členu delegáta určitého typu
Nemohou být vyvolány z jiné třídy, než ve které byly deklarovány včetně tříd odvozených
Implementovat lze zavoláním metody implementované na bázové třídě, která danou událost vyvolává
Obsluha události Pro obsluhu je nutné nějakou třídu nastavit jako předplatitele události K události leze přistoupit jako ke členu instance, ale jeho užití je velmi omezené Jediná možná úprava je přidání nebo odebrání delegáta pro obsluhu
Generické datové typy Generický kód užívá parametrizované typy Parametrizované typy jsou nahrazeny konkrétními typy v době užití kódu
Výhody Čistý, rychlý a bezpečný výsledný kód Silná typová kontrola v době překladu Odhalení všech vad, které by mohli způsobit havárii aplikace v důsledku špatně
užitých typů již při překladu Odstraní se časté a časově zbytečné operace boxing a unboxing Omezí se explicitní typové konverze, které jsou nutné v době překladu, kdy neznáme
typ objektu uloženého v universální kolekci
Základní omezení Vychází z užití generik
Specifikace požadavků na systémové parametry Zabezpečují, že typy poskytují požadovanou funkcionalitu Umožňují silnější typové kontroly při překladu Omezují potřeby explicitních typových konverzí Poskytují možnost omezení použitelnosti výsledného generika
Omezení generik
Omezení třídy (Class constraint) Konkrétní typ, který v generickém kódu použijeme, musí být odvozen od specifické
základní třídy => zajištění jisté funkcionality
Omezení rozhraním (Interface constraint) Zajišťuje, že užité rozhraní je implementováno od konkrétního specifického rozhraní
Omezení konstruktoru (Constructor constraint) Požadavek, aby třída nebo struktura, kterou užíváme obsahovala veřejný implicitní
konstruktor
Generické třídy Deklarace je stejná jako u deklarace třídy akorát vyžaduje seznam typových
parametrů k vytvoření skutečných typů Typový parametr: třída, abstraktní třída, rozhraní, výčtový typ
Atributy a metadata Dot.net definuje možnost asociovat libovolné informace (metadata) se zdrojovým
kódem apliace Metadata jsou reprezentována atributy Po kompilaci se atributy stanou součástí assembly V programu přistoupíme k metadatům pomocí reflex
Předdefinované atributy Každý použitý atribut je instancí třídy která přímo nebo nepřímo dědí od třídy systém
atribute
Serializable Pokud chceme, aby instance třídy byla uložena na diskový prostor (serializována)
Obsolete Atribut signalizuje, že daná metoda je jicž zastaralá a není vhodné ji nadále užívat
Conditional Vytváří funkce pouze pro debuging programu
Uživatelsky definované atributyParametry atributů
Poziční parametry se dávají jako formální parametry konstruktoru a jsou vždy povinné
Pojmenované parametry se dávají pomocí jména a operátoru přiřazení
Cíl atributu je dán výčtovým typem Attribute Tragets a lze jej kombinovat pomocí logického operátoru or
nejsou kladeny žádná omezení a množinu atributů
Reflexe Aplikace mohou využívat metadata a rozšiřovat je o nové informace Reflexí je označováno prozkoumávání existujících typů metadat a uskutečňuje se
pomocí sady typů v oboru názvů systém refletion Základní jednotkou aplikace jsou její typy obsahující členy vnořené typy Typy jsou v modulech a ty obvykle v sestavách Všechny elementy aplikace jsou popsány metadaty Za běhu aplikace jsou tyto elementy obsaženy uvnitř domény indomain
Vytváření nových typů za běhu programu Obor názvů systém reflektionemit obsahuje třídy, které dokáží vytvořit za běhu úplně
nové typy¨ Umožňují definovat dynamickou sestavu v paměti Umožňuje Definovat dynamický modul v definované sestavě Umožňuje Definovat nový typ v definovaném modulu včetně jeho členů Umožňuje vytvořit kódy CIL potřebné k implementování aplikační logiky ve členech
Vlákna Ve výchozím stavu je pouze jedno vlákno, které vytvoří běhové prostředí CLR, je
označeno jako primární nebo hlavní vlákno Je podporováno paralelní zpuštění kódu pomocí ztv. Multithreadingu Aplikace může běžet v jednom nebo více vláknech Vlákna v jedné aplikaci jsou uzavřena v jednom kontejneru označovaným jako proces Ve výchozím stavu běží vlákna aplikace na pozadí => aplikace běží tak dlouho,
dokud běží alespoň jedno vlákno Jazyk umožňuje využití vláken běžících na pozadí – pokud vypneme všechna vlákna
běžící na popředí, tak se aplikace vypne, i když na pozadí vlákna ještě fungují Priorita vlákna určuje, kolik času dostane vlákno na vykonání své činnosti Vlákna leze koordinovat pomocí synchronizace
Stav vlákna lze zjisti pomocí vlastnosti ThreadState Neošetřená výjimka na vlákně shodí celou aplikaci ParamterizedThreadStart umožňuje překládání vláknu parametr typu objekt
Vytváření a spouštění vláken Třída Thread v rozhraní dot.net poskytuje podporu pro spuštěná vlákna v aplikacích Třída Thread obsahuje metody, které zdánlivě řeší operace pozastavení, pokračování a
ukončení vláken Vlákna jsou vytvářena pomocí konstruktoru třídy Thread předávajícího delegáta
ThreadStart, který označuje metodu, kde by měla začít práce vlákna Vlákno lze spusti bez parametru nebo s parametrem
Kooperativní multitásking Každé vlákno musí spolupracovat tím, že sdílí svůj stav, jinak se výkon začne
zhoršovat Užíván staršími verzemi Windows
Preemptivní multitásking Neposkytuje vláknu žádnou volbu při určování, jak bud činnost vykonávat Za stanovení, jak se má vlákno provádět je zodpovědný podsystém vlákna
Stavba vlákna Threadstate je neodcenitelný při debugingu, ale je problémové jeho užití pro více
vláken