YOUR LOGO Dátové typy, Stream, StringBuilder,...
YOUR LOGO Dátové typy Hodnotové a referenčné
YOUR LOGO Typy Keyword.NET Framework Type DescriptionVariable Declaration Example boolSystem.Boolean Boolean type; a bool value is either true or false. true or false bool val1 = true; bool val2 = false; byteSystem.Byte 8-bit unsigned integral type 0 to 255byte val1 = 12; charSystem.Char 16-bit unicode character 0 to char c = ‘a’; char c = 255; decimalSystem.Decimal 128-bit fixed-point decimal type with 28 significant digits -7.9e28 to 7.9e28 decimal val = 1.23M; doubleSystem.Double 64-bit double- precision floating point type -1.79e308 to 1.79e308 double val1 = 1.23; double val2 = 4.56D; floatSystem.Single 32-bit single- precision floating point type -3.40e38 to 3.40e38 float val = 1.23F ;
YOUR LOGO Keyword.NET Framework Type DescriptionVariable Declaration Example intSystem.Int32 32-bit signed integral type -2,147,483,648 to 2,147,483,647 int val = 12; longSystem.Int64 64-bit signed integral type - 9,223,372,036,8 54,775,808 to 9,223,372,036,8 54,775,807 long val1 = 12; long val2 = 34L; sbyteSystem.SByte 8-bit signed integral type -128 to 127sbyte val = 12; shortSystem.Int16 16-bit signed integral type -32,768 to short val = 12; stringSystem.String Immutable string of 16-bit Unicode characters All valid string characters string val = "Hello world." uintSystem.UInt32 32-bit unsigned integral type 0 to 4,294,967,296 uint val1 = 12; uint val2 = 34U; ulongSystem.UInt64 64-bit unsigned integral type 0 to 18,446,744,073, 709,551,615 ulong val1 = 12; ulong val4 = 78UL; ushortSystem.UInt16 16-bit unsigned integral type 0 to 65535ushort val1 = 12;
YOUR LOGO Inicializácia System.Int32 x = 5; int x = 5; x = new int(); - default i int je 0 Odkazové typy defaultne ukazujú na null
YOUR LOGO Operácie TypOperátorFunkciaPríklad Arithmetic +Addx = 1 + 2; -Subtractx = 1 - 2; *Multiplyx = 1 * 2; /Dividex = 1 / 2; %Modulus x = 5 % 2; vráti Konkatenace reťazacov +String concatenation string str = "Hello " + "World"; Increment/decrement ++Increment int x = 5; int y = x++; // hodnota y je 5 // hodnota x je 6 --Decrement int x = 5; int z = --x; // hodnota z je 4 // hodnota x je 4
YOUR LOGO TypOperátorFunkciaPríklad Porovnanie, výsledok true/false ==Rovný 1 == 1 would return true (1 is equal to 1) !=Nerovný 1 != 1 would return false 1 != 2 would return true (1 is not equal to 2) <Menší 1 < 2 would return true (1 is less than to 2) >Väčší 2 > 1 would return true (2 is greater than to 1) <=Menší alebo rovný 1 <= 1 would return true (1 is equal to 1) >=Väčší alebo rovný 1 >= 1 would return true (1 is equal to 1) Logický &&A ||Alebo true false
YOUR LOGO Priradenie +=Pripočítaj a priraď int x = 5; x += 100; // x 105; -=Odpočítaj a priraď int x = 5; x -= 100; // x 95; *=Vynásob a priraď int x = 5; x *= 100; // x 500; /=Vydeľ a priraď int x = 100; x /= 100; // x 20; %=Modulo a priraď int x = 5; x %= 100; // x 0;
YOUR LOGO Pretypovanie Implicitné -Ku konverzii dôjde ak by bola bezstratová -Automatická konverzia Explicitná -Je nutné zadať ak môže byť strata dát -(typ) hodnota -int x = (int)3.5f;
YOUR LOGO Implicitné pretypovanie
YOUR LOGO Strata dát
YOUR LOGO Pretypovanie referenčných typov Implicitné – Upcasting -string str = "Hello World"; object obj = str; Explicitné – Downcasting -castobject obj = "Hello World"; string str = (string)obj; -object obj = "Hello World"; string str = (obj as string);
YOUR LOGO Pretypovanie hodnotového na referenčný Boxing Vytvorenie kópie hodnoty a jej umiestnenie na heap int x = 100; object obj = x;
YOUR LOGO Unboxing object obj = 100; int x = (int)obj;
YOUR LOGO Pole Pole je referenčný typ Všetky elementy musia byť rovnakého typu Pole začína od 0
YOUR LOGO Pole Deklarácia a inicializácia -int[] array1; -int[] array2 = new int[3]; -int[] array3 = new int[3] { 0, 1, 2 }; -int[] array4 = new int[] { 3, 4, 5 };
YOUR LOGO Jagged Array Jagged array – pole ukazateľov na polia int[][] array1 = new int[3][] {new int[3]{1,2,3}, new int[4]{4,5,6,7}, new int[5]{8,9,10,11,12}};
YOUR LOGO Podmienky IF Else Case return ((x == 0) ? "Hello" : "Goodbye")
YOUR LOGO Foreach int[] numbers = {1,4,9,16}; foreach( int i in numbers ) { Console.WriteLine(" {0}", i); }
YOUR LOGO Řetězce Řetězce jsou implementovány primitivním referenčním typem String -tento typ je nezměnitelný - jeho hodnoty jsou uloženy ve speciálních tabulkách (ne na haldě) -jejich identita je dána obsahem jsou vždy inicializovány literálem, jejich konstruktor se nedá volat všechny operace se chovají tak, že vrátí nový řetězec místo, aby změnily stav stávajícího
YOUR LOGO Řetězce chovají se jako kolekce typu System.Char – implementují IEnumerable, mají indexer základní řetězcové operace – Concat, Substring, Replace, Insert, ToUpper,... přetížené operátory - + (konkatenace), == (porovnání obsahů), != (různost obsahů), = (kopíruje obsah řetězce do jiného řetězce)
YOUR LOGO StringBuilder StringBuilder -konstruktorem se vytvoří základní buffer o 16 bytech, který se prodlužuje a zkracuje podle potřeby -StringBuilder sb1 = new StringBuilder();sb1 = "First string";StringBuilder sb2 = new StringBuilder("Second string");
YOUR LOGO String vs StringBuilder Počet konkatenací Optimum StringBuilder String
YOUR LOGO Operácie StringBuilder MethodDescription and Example Append StringBuilder sb2 = new StringBuilder("Second string"); sb2.Append(" Third string"); Insert StringBuilder sb2 = new StringBuilder("Second string"); sb2.Insert(0,"First string "); Remove StringBuilder sb2 = new StringBuilder("Second string"); sb2.Remove(12,6); Replace StringBuilder sb3 = new StringBuilder("I love cats"); sb3.Replace("cat","dog"); ToString StringBuilder sb1 = new StringBuilder("Click Me..."); button1.Text = sb1.ToString();
YOUR LOGO Výjimky Chybové stavy jsou řešeny většinou pomocí výjimek – při výjimce se přeruší vykonávání kódu, vytvoří se objekt obsahující informace a hledá se někdo, koho to zajímá (v krajním případě uživatel aplikace) speciální konstrukce v jazyce umožňují vyjádřit zájem na daném místě kódu převzít informaci o výjimce a nějak ji zpracovat
YOUR LOGO Třídy výjimek Informace o výjimce se předávají prostřednictví speciálních tříd, které dědí od třídy System.Exception tato poskytuje základní vlastnosti a kořen hierarchie vlasnosti – Message, Source, StackTrace, TargetSite, InnerException slovník Data – dodatečné informace jako dvojice klíč hodnota (může je přidávat i uživatel)
YOUR LOGO System.Exception má čtyři konstruktory -defaultní bez parametrů -s jedním parametrem typu string -s jedním parametrem typu string a jedním typu Exception -protected konstruktor pro deserializaci všechny vlastnosti jsou read-only
YOUR LOGO Hierarchie výjimek
YOUR LOGO Chytání výjimek konstrukce try blok catch blok finally blok kód se vykonává 1.vykonává se try blok a pokud se dojde na jeho konec, předá se řízení do finally 2.pokud dojde k výjimce přeskočí se na začátek příslušného catch bloku a pak se pokračuje jako v 1. 3.vykoná se finally blok
YOUR LOGO Chytání výjimek je možné vynechat catch blok nebo finally blok, ale ne oba příkaz catch může být specifický – pak je tvaru catch (typ [identifikátor]) platí, že při vzniku výjimky se řízení předá do prvního specifického bloku catch, jehož typ je typem vytvořeného objektu výjimky. typ musí být odvozen od System.Exception
YOUR LOGO Chytání výjimek obvykle za sebe řadíme specifické catch bloky se vzrůstající obecností pokud není výjimka zachycena ve funkci, kde vznikla nebo je znovu vyhozena, je předána nadřízené funkci, to se děje tak dlouho dokud není zpracována v krajním případě je předána runtimu, který ji zpracuje tak, že ukončí běh programu a uživatele informuje o výjimce, která nebyla v programu zpracována.
YOUR LOGO Vnořené bloky try je možné do sebe bloky try vnořovat : try { //A try { //B } catch { //C } finally { //uklid } //D } catch { // osetreni chyb }
YOUR LOGO Příkaz throw Výjimku je možné vygenerovat pomocí příkazu throw vyjimka vyjimka je jakýkoliv výraz, který je typu odvozeného od System.Exception typicky se použije výraz s operátorem new nebo reference na předpřipravený objekt výjimky throw new Exception(“Vyjimka“); bez parametru slouží k přeposlání výjimky dál (částečné zpracování) pokud vyhazujeme výjimku v catch bloku, použijeme vlastnost InnerException třídy System.Exception k uložení výjimky, kterou jsme zpracovávali
YOUR LOGO Bloky finally kód v nich se provede vždy, i když došlo v bloku try k výjimce používají se k úklidu (zavření souborů a podobně) a jiným nezbytným akcím místo dvojice try...finally, kde se v bloku try alokují zdroje a v bloku finally uvolňují lze použít konstrukci
YOUR LOGO Príklad komplexného ošetrenia Exception
YOUR LOGO Regulární výrazy jsou reprezentovány třídou System.Text.RegularExpressions.RegEx jsou to speciální řetězce, které slouží k vyhledávání a nahrazování podřetězců v jiných řetězcích jsou kompatibilní s PERL5 regulárními výrazy
YOUR LOGO Regulární výrazy základní typ je prostě podřetězec – “abab”, najde řetězec, obsahující právě tyto znaky v tomto pořadí lze vytvářet složitější typy vkládáním speciálních znaků například znaky pro polohu v řetězci ^, $ - začátek a konec řádku, \z – konec řetězce, \b – začátek slova, např “^abc$”
YOUR LOGO Regulární výrazy znaky pro speciální znaky – -\t – tab, \n – newline, \u0020 – unicodový znak s číslem 32 např. “^ab\u0022\n” znaky pro opakování – píší se za znak a určují, že se musí(může) v příslušném řetězci opakovat a kolikrát – -*(0 nebo více), +(1 nebo více), ?(0 nebo 1), {n}, {n,}, {n,m} (n, n nebo více, mezi n a m) -normálně je hladové (hledá nejdelší podřetězec), přidáním dalšího otazníku se změní na líné (nejkratší)
YOUR LOGO Regulární výrazy znaky pro typy znaků – pokud je na příslušné pozici znak z příslušného seznamu nebo příslušného typu -. – jakýkoliv jeden znak, x|y – znak x nebo y, [xyz] – kterýkoliv z x, y a z, [a-z] – rozsah -typy - \d – číslice, \D nečíslice, \s – whitespace ap.
YOUR LOGO Regex objIntPattern=new Regex("^-[0-9]+$|^[0-9]+$"); Matches/Match string t14 = " test 1 test 2.3 test 47 "; string p14 MatchCollection mc14 = Regex.Matches(t14, p14); Regular Expression Library:
YOUR LOGO System.Convert
YOUR LOGO Vstup a výstup – souborový systém BCL obsahuje množství tříd, které umožňují pracovat se souborovým systémem jsou ve jmenném prostoru System.IO základní třídy jsou FileSystemInfo, FileInfo, DirectoryInfo a DriveInfo. Reprezentují různé prvky systému souborů.
YOUR LOGO Práce se soubory a adresáři FileInfo a DirectoryInfo mají konstruktor, kterému se předá cesta k souboru nebo k adresáři mají instanční metody, které implementují operace na souborovém systému – kopírování, vytváření, přesouvání, otvírání a podobně existují třídy File a Directory, které poskytují stejnou funkcionalitu, ale jejich příslušné metody jsou statické a cesty k souborům se jim předávají jako parametry
YOUR LOGO Třída Path pomocná třída pro práci s řetězci obsahujícími cesty k souborům metody jako ChangeExtension, GetExtension, GetPathRoot, HasExtension – pracují s řetězcem cesty metoda GetTempFileName – založí dočasný soubor a vrátí cestu k němu
YOUR LOGO FileSystemWatcher třída, která umožňuje sledovat změny v daném adresáři má konstruktor, kterému předáme cestu k adresáři má vlastnost Filter, která obsahuje masku, jaké soubory se mají sledovat vlastnost NotifyFilter určuje, které události se mají sledovat události Changed, Created, Deleted a Renamed typu FileSystemEventHandler
YOUR LOGO Vstup a výstup je prováděn pomocí proudů (stream) proud je posloupnost hodnot, která může být potenciálně ukončena v BCL jsou proudy implementovány pomocí abstraktní třídy System.IO.Stream, která zajišťuje základní operace na abstraktním proudu (čtení (read), psaní (write), posun kursoru (seek), timeout)
YOUR LOGO Stream – vlastnosti a metody CanRead, CanSeek, CanWrite, CanTimeout – podporuje daný proud čtení, psaní, vyhledávání, timeout? Length, Position – délka v bytech, poloha virtuálního kurzoru v rámci proudu metody Read, ReadByte – načtení více, jednoho bytu a posun ukazatele metody Write, WriteByte – zápis více nebo jednoho bytu a posun ukazatele Seek – nastavení pozice na dané místo (parametry offset a začátek hledání) Flush – vyprázdní proud na zařízení nebo do základního proudu
YOUR LOGO FileStream základní třída pro čtení z a zápis do souboru, podporuje čtení a zápis bytů oproti Stream podporuje navíc metody Lock a Unlock, které zakazují jiným procesům číst a zapisovat do souboru podporuje zápis, čtení i seek Seek(Int64 offset, SeekOrigin origin)
YOUR LOGO StreamReader(Writer) třídy pro zápis a čtení znaků všechny čtecí metody vracejí řetězce nebo pole řetězců třídy jsou dvě – jedna pro čtení a jedna pro zápis StreamReader – operace Peek, Read(Block|Line|ToEnd) StreamWriter – Write, WriteLine
YOUR LOGO Kódování tyto proudy navíc podporují kódování znaků kódování je reprezentováno třídou System.Text.Encoding a představuje způsob, jak abstraktní text zaznamenat v paměti počítače třída Encoding má vlastnosti vracející nejčastější kódování ( ASCII, Unicode, UTF32 ) a statickou metodu GetEncoding(string), která vrátí kódování reprezentované řetězcem (např. windows )
YOUR LOGO Kódování oba znakové proudy mají konstruktor, kterému je možné předat kódování StreamWriter sw = new StreamWriter(file, Encoding.UTF7); defaultní je Unicode, u čtení není obvykle nutné kódování uvádět, pokud se jedná o běžné unicodové typy třída Encoding má metodu GetBytes, která běžný řetězec převede na pole bytů v příslušném kódování
YOUR LOGO Vytváření proudů FileStream vrací metoda Open třídy File, je ale třeba nastavit vhodná práva a mód -módy – FileMode.(Open, Create, CreateNew, Append, OpenOrCreate) -práva – FileAccess.(Read, ReadWrite, Write) -je možno použít metodu OpenWrite k otevření exitujícího souboru k zápisu a OpenRead ke čtení jméno souboru je možno předat i přímo konstruktoru třídy FileStream
YOUR LOGO Vytváření proudů Třída File má také celou řadu metod, jejichž jména končí na Text, a které vracejí příslušný StreamReader nebo Writer s nastaveným kurzorem a právy -ke čtení OpenText -k zápisu AppendText, CreateText některé metody také úplně odstiňují vytváření proudů – ReadToEnd, WriteAllText
YOUR LOGO Základní a adaptérové proudy proudy lze navazovat na sebe, první čte přímo z externího zařízení každý další pak z předchozího (a každý přidává nějakou zvláštní vlastnost) je to vlastně opět způsob jak přidat vlastní chování k existující třídě typické adaptérové třídy jsou readry a writery (např. StreamReader přidává schopnost číst a rozeznávat znaky) adaptérový proud navážeme na základní tak, že základní předáme konstruktoru adaptérového
YOUR LOGO Adaptérové proudy Typicky, zápis do souboru : -vytvoření základního proudu FileStream fs = new File.Create(cesta); -vytvoření proudu pro zápis StreamWriter sw = new StreamWriter(fs); -práce s writerem sw.WriteLine(“Zapiseme retezec”); -zavření obou proudů sw.Close(); fs.Close();
YOUR LOGO Další základní proudy Zatím jsme viděli základní proud pro práci se souborem – FileStream další proudy pracují nad jiným zdrojem – MemoryStream, NetworkStream mohou se lišit funkčností podle charakteru příslušného zařízení - MemoryStream neumí timeout, ale umí seek - NetworkStream naopak StringReader – nad Stringem, StringWriter – nad StringBuilderem
YOUR LOGO Další adaptérové proudy Zatím jsme potkali StreamReader a Writer pro zápis/čtení znaků BufferedStream – slouží ke zvýšení výkonu, používá vyrovnávací paměť pro čtení a zápis BinaryReader a Writer – zápis a čtení binárních (např. strukturovaných) dat -přetížená metoda Write BinaryWriter u -metody ReadJmenoTypu (např. ReadInt64 ) BinaryReader u
YOUR LOGO Adaptérové proudy GZipStream a DeflateStream – komprese dat v proudech metodami ZIP a DEFLATE -data se komprimují a dekomprimují prostě zápisem do a čtením z těchto proudů -konstruktor má kromě základního proudu ještě parametr typu enum CompressionMode.(Compress | Decompress)