Eseményvezérelt alkalmazások fejlesztése II 2. előadás. A C# nyelvi elemei és nyelvi könyvtára. Giachetta Roberto

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése II 1. előadás. A.NET platform és a C# programozási nyelv. Cserép Máté

Eseményvezérelt alkalmazások fejlesztése II 1. előadás. A.NET platform és a C# programozási nyelv. A.NET platform és a C# programozási nyelv

Generikus Típusok, Kollekciók

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése

Objektumorientált programozás C# nyelven

Generikus osztályok, gyűjtemények és algoritmusok

Programozási technológia

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Informatika terméktervezőknek

Pénzügyi algoritmusok

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

I. rész: A Microsoft Visual C# és a Microsoft Visual Studio 2005 bemutatása. 1. Üdvözöljük a C# világában! 3

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Bánsághi Anna

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Eseményvezérelt alkalmazások fejlesztése II. A.NET keretrendszer és a C# programozási nyelv. Objektumorientált programozási nyelvek A Smalltalk nyelv

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Java programozási nyelv 9. rész Kivételkezelés

Kivételkezelés a C++ nyelvben Bevezetés

Programozási nyelvek Java

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

.Net adatstruktúrák. Készítette: Major Péter

Objektumorientált programozás C# nyelven

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése. Giachetta Roberto

Bánsághi Anna 2014 Bánsághi Anna 1 of 35

Kivételek, kivételkezelés a C++ nyelvben

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Fejlett programozási nyelvek C++ Iterátorok

és az instanceof operátor

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Objektumorientált programozás C# nyelven III.

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozási nyelvek Java

A C# programozási nyelv alapjai

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Programozási nyelvek JAVA EA+GY 1. gyakolat

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Osztályszintű elérés, kivételkezelés, fájlkezelés

Pénzügyi algoritmusok

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Java programozási nyelv 4. rész Osztályok II.

Java II. I A Java programozási nyelv alapelemei

Globális operátor overloading

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozási nyelvek Java

A szerzõrõl... xi Bevezetés... xiii

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Programozási technológia

Java IX. telkezelés a Java-ban

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Szoftvertechnológia alapjai Java előadások

Bevezetés, a C++ osztályok. Pere László

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Java IX. telkezelés a Java-ban

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

C++ programozási nyelv

3. Osztályok II. Programozás II

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Készítette: Nagy Tibor István

Programozási nyelvek Java

Apple Swift kurzus 3. gyakorlat

Abstract osztályok és interface-ek. 7-dik gyakorlat

Python tanfolyam Python bevezető I. rész

Térinformatikai algoritmusok Elemi algoritmusok

Osztályok. 4. gyakorlat

Vizuális, eseményvezérelt programozás X. V 1.0

Pénzügyi algoritmusok

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

OOP #14 (referencia-elv)

Java II. I A Java programozási nyelv alapelemei

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Bevezetés a programozásba 2

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

Programozási nyelvek Java

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Objektumorientált programozás C# nyelven III.

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Programozás II gyakorlat. 8. Operátor túlterhelés

Adatbázisok webalkalmazásokban

Már megismert fogalmak áttekintése

1. Alapok. Programozás II

1. Jelölje meg az összes igaz állítást a következők közül!

AWK programozás, minták, vezérlési szerkezetek

Bánsághi Anna

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése II 2. előadás A C# nyelvi elemei és nyelvi könyvtára Giachetta Roberto A jegyzet az ELTE Informatikai Karának 2014. évi Jegyzetpályázatának támogatásával készült

Előfordítási direktívák A nyelv tartalmaz előfordítási direktívákat, amelyek előzetesen kerülnek feldolgozásra, így lehetőséget adnak bizonyos kódsorok feltételes fordítására, hibajelzésre, környezetfüggő beállítások lekérdezésére, pl. #if, #define, #error, #line Mivel nem választható szét a deklaráció a definíciótól, a kód tagolását a régiók segítik elő, amelyek tetszőleges kódblokkokat foghatnak közre: #region <név> #endregion nem befolyásolják a kódot, csupán a fejlesztőkörnyezetben érhetőek el ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:2

Megjegyzések Az egyszerű megjegyzések a fordításkor törlődnek sor végéig tartó: // megjegyzés tetszőleges határok között: /* megjegyzés */ A dokumentációs megjegyzések fordításra kerülnek, és utólag előhívhatóak a lefordított tartalomból osztályok és tagjaik deklarációjánál használhatjuk célja az automatikus dokumentálás elősegítése és a fejlesztőkörnyezetben azonnal segítség megjelenítése a /// jeltől a sor végéig tart, belül XML blokkok adhatóak meg, amelyek meghatározzák az információ jelentését ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:3

Megjegyzések pl.: /// <summary> /// Racionális szám típusa. /// </summary> /// <remarks>két egész szám hányadosa.</remarks> struct Rational { /// <summary> /// Racionális szám példányosítása. /// </summary> /// <param name="n">számláló.</param> /// <param name="d">nevező.</param> public Rational(Int32 n, Int32 d) { } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:4

Kivételkezelés A.NET keretrendszerben minden hiba kivételként jelenik meg a kivétel általános osztálya az Exception, csak ennek vagy leszármazottjának példánya váltható ki kivételt kiváltani a throw utasítással tudunk: throw new <kivétel típusa>(<paraméterek>); kivételt kezelni egy kivételkezelő (try-catch-finally) szakasszal tudunk: try { <kivételkezelt utasítások> } catch (<elfogott kivétel típusa>){ <kivételkezelő utasítások> } finally { <mindenképp lefuttatandó utasítások> } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:5

Kivételkezelés Pl.: class WorkingClass { public void DoSomething(Int32 number) { if (number < 1) throw new ArgumentOutOfRangeException(); // kivétel kiváltása (a paraméter hibás // tartományban van) throw new Exception("Too lazy "); // kivétel kiváltása (üzenettel) } public void Finish() { } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:6

Kivételkezelés Pl.: WorkingClass wc = new WorkingClass(); try // kivételkezelő blokk { wc.dosomething(); } // a kivételt típustól függően kezelhetjük catch (ArgumentOutOfRangeException ex) { } // az Exception típusú kivételt nem kezeljük le finally { wc.finish(); // de ez mindenképpen lefut } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:7

Generikus típusok Generikus programozásra futási időben feldolgozott sablon típusok (generic-ek) segítségével van lehetőség osztály, metódus és delegált lehet sablonos, a sablon csak osztály lehet a sablon fordításra kerül, és csak a futásidejű fordításkor helyettesítődik be a konkrét értékre pl.: struct Rational<T> { private T nom; // használható a T típusként public Rational(T n, T d) { } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:8

Generikus típusok Rational<SByte> r1 = new Rational<SByte>(10,5); Rational<Int64> r2 = new Rational<Int64>(10,5); // különböző értékkészletű racionálisok A szigorú típuskezelés miatt a sablonra csak a Object-ben értelmezett műveletek használhatóak, ezt a műveletkört növelhetjük megszorításokkal (where) pl.: class Rational<T> where T : struct, IComparable, IFormattable, IConvertible { // T elemi osztály, amire használható a fenti // interfészek összes művelete } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:9

Tömbök A tömbök osztályként vannak megvalósítva (System.Array), de egyszerűsített szintaxissal kezelhetőek, pl.: Int32[] myarray = new Int32[10]; // létrehozás myarray[0] = 1; // első elem beállítása referencia szerint kezeltek, méretnek változó is megadható, az értékek inicializálhatóak, pl.: Int32[] myarray = new Int32[] { 1, 2, 3, 4 }; // a tömb 4 hosszú lesz akár több dimenziósak is lehetnek, pl.: Int32[,] mymatrix = new Int32[10, 5]; // mátrix mymatrix[0, 0] = 1; // első sor első eleme Double[,,] mymatrix3d = new Double[10, 5, 10]; // 3 dimenziós mátrix ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:10

Tömbök Fontosabb műveletei: hossz lekérdezés (Length, LongLength, GetLength) dimenziószám lekérdezése (Rank) Statikus műveletként számtalan lehetőségünk van, pl.: másolás (Copy), átméretezés (Resize) rendezés (Sort), fordítás (Reverse) lineáris keresés (Find, IndexOf, LastIndexOf), bináris keresés (Binary Search) A tömböknél (és más gyűjteményeknél) alkalmazott indexelő művelet megvalósítható saját típusokra is (paraméteres tulajdonságként) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:11

Gyűjtemények A gyűjtemények a System.Collections névtérben találhatóak, a legtöbb gyűjteménynek van általános és sablonos változata is, pl.: dinamikus tömbök: ArrayList, List<T>, SortedList, SortedList<Key, Value> láncolt listák: LinkedList<T> verem: Stack, Stack<T> sor: Queue, Queue<T> asszociatív tömb: Hashtable, Dictionary<Key, Value>, SortedDictionary<Key, Value> halmaz: HashSet<T>, SortedSet<T> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:12

Gyűjtemények A nem sablonos gyűjteményekbe bármilyen elemeket helyezhetünk A dinamikus tömbök indexelhetőek, és változtatható a méretük (bárhova beszúrhatunk, bárhonnan törölhetünk), pl.: List<Int32> intlist = new List<Int32>(); // üres tömb létrehozása intlist.add(1); // elemek hozzáadása intlist.insert(0, 100); // beszúrás az elejére intlist.remove(100); // elem törlése for (Int32 i = 0; i < intlist.count; i++) Console.WriteLine(intList[i]); // lekérdezés intlist.clear(); // kiürítés ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:13

Fájlrendszer-kezelés A fájlokkal és fájlrendszerrel kapcsolatos műveletek a System.IO névtérben helyezkednek el fájlműveleteket a File, könyvtárműveleteket a Directory osztály statikus műveleteivel hajthatunk végre, pl.: Directory.CreateDirectory(@"c:\Data"); // könyvtár létrehozása String[] paths = Directory.GetFiles(@"c:\Data"); // könyvtár listázása File.Copy(@"c:\data.txt", @"c:\data\data.txt"); // fájl másolása az elérési útvonallal kapcsolatos műveletek a Path osztályban találhatóak, pl.: Path.GetParent(@"c:\Data"); // szülő lekérdezése ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:14

Fájlkezelés Az adatfolyamok kezelése egységes formátumban adott, így azonos módon kezelhetőek fájlok, hálózati adatforrások, memória, stb. az adatfolyamok ősosztálya a Stream, amely binárisan írható/olvasható Szöveges adatfolyamok írását, olvasását a StreamReader és StreamWriter típusok biztosítják létrehozáskor megadható az adatfolyam, vagy közvetlenül a fájlnév csak karakterenként (Read), vagy soronként (ReadLine) tudunk olvasni, így konvertálnunk kell ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:15

Fájlkezelés Pl.: amennyiben a műveletek során hiba keletkezik, IOException-t kapunk StreamReader reader = new StreamReader("in.txt"); // fájl megnyitása while (!reader.endofstream) // amíg nincs vége { Int32 value = Int32.Parse(reader.ReadLine()); // sorok olvasása, majd konvertálás } reader.close(); // bezárás ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:16

Erőforrások felszabadítása A referencia szerinti változók törlését a szemétgyűjtő felügyeli adott algoritmussal adott időközönként pásztázza a memóriát, törli a felszabadult objektumokat sok, erőforrás-igényes objektum példányosítása esetén azonban nem mindig reagál időben, így nő a memóriahasználat a GC osztály segítségével beavatkozhatunk a működésbe A manuális törlésre (destruktor futtatásra) nincs lehetőségünk felügyelt blokkban, de erőforrások felszabadítására igen, amennyiben az osztály megvalósítja az IDisposable interfészt, és benne a Dispose() metódust ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:17

Erőforrások felszabadítása Emellett a C# nyelv tartalmaz egy olyan blokk-kezelési technikát, amely garantálja a Dispose() automatikus futtatását: using (<objektum példányosítása>){ <objektum használata> } // itt automatikusan meghívódik a Dispose() Pl.: using (StreamReader reader = new StreamReader( )){ // a StreamReader is IDisposable } // itt biztosan bezáródik a fájl, és // felszabadulnak az erőforrások ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:18

Lamda-kifejezések A lambda-kifejezések (lambda-expressions) funkcionális programozásból átvett elemek, amelyek egyszerre függvényként és objektumként is viselkednek A λ-kifejezést az => operátorral jelöljük, tőle balra a paraméterek, jobbra a művelet törzse írható le, pl.: a => a * a // négyzetre emelés x => x.length < 5 // 5-nél rövidebb szövegek (x, y) => x + y; // összeadás () => 5; // konstans 5 A λ-kifejezést elmenthetjük változóként is, típusa a sablonos Func<...> lesz, pl.: Func<String, Boolean> lt5 = x => (x.length < 5); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:19

Lamda-kifejezések Az eltárolt kifejezés bármikor futtathatjuk, mint egy függvényt, pl.: Boolean l = lt5("hello!"); // l hamis lesz A λ-kifejezések tetszőlegesen összetett utasítássorozatot is tartalmazhatnak, nem csak egy kifejezés kiértékelését, ekkor a tartalmat blokkba kell helyezni, pl.: Func<Int32, Int32> pow2 = x => { x = x * x; return x; }; A λ-kifejezések speciális típusa az akció (Action), amely egy paraméter és visszatérési érték nélküli tevékenység, pl.: Action hello = () => { Console.Write("Hello!"); }; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:20

Nyelvbe ágyazott lekérdezések A nyelvbe ágyazott lekérdezések (Language Integrated Query) célja, hogy objektumorientált környezetben valósíthassunk meg lekérdező utasításokat hasonlóan a relációs adatbázisok SQL nyelvéhez pl.: List<Int32> nrlist = new List<Int32> { 1, }; var numquery = from i in numberlist // honnan where i < 4 // feltétel select i; // mit az eredmény egy gyűjtemény (IEnumerable) lesz, és a kifejezés csak akkor értékelődik ki, amikor azt bejárjuk (késleltetett végrehajtás) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:21

Nyelvbe ágyazott lekérdezések A nyelvbe ágyazott lekérdezések mögött λ-kifejezésekkel dolgozó metódusok találhatóak, amelyek bármilyen gyűjteményre futtathatóak (akár külön-külön is) pl.: var numquery = numberlist // honnan.where(i => i < 4) // feltétel.select(i => i); // mit a metódusok úgynevezett bővítő metódusként definiáltak, amelyek elérhetőek a System.Linq névtérben bonyolultabb lekérdezések is megvalósíthatóak (pl. unió, csoportosítás, összekapcsolás, rendezés, ) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:22

Nyelvbe ágyazott lekérdezések Pl.: Int32[] s1 = { 1, 2, 3 }, s2 = { 2, 3, 4 }; Int32 sum = s1.sum(); // számok összege Int32 evencount = s1.sum(x => x % 2 == 0? 1 : 0); // megadjuk, mit összegezzen, így a páros // számok számlálása lesz var union = s1.union(s2); // két gyűjtemény uniója: { 1, 2, 3, 4 } var evens = union.select(x => x % 2 == 0); // páros számok kiválogatása Int32 evencount = s1.union(s2).sum(x => x % 2 == 0? 1 : 0); // unió, majd a páros számok számlálása ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 2:23