Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaBrigitta Balog Megváltozta több, mint 6 éve
1
Programozás .NET-ben Szi Brigitta 2014. szeptember. 26.
2
A .NET A 90-es évek közepén a Sun MicroSystems kiadta a Java platform első nyilvános változatát. Erre válaszképp a Microsoft a 90-es évek végén elindította a Next Generations Windows Services projektet. Ebből lett a .NET. A Visual Studio 6.0 fejlesztőrendszer átdolgozásaként jelent meg. Majd az évek során teljesen átvette az uralmat a Microsoft fejlesztői palettáján.
3
A .NET framework kialakításának főbb szempontjai
Gyors és biztonságos programfejlesztés Megbízható környezetben való program futtatás Különböző HW platformok támogatása hasonló komponensekkel Hálózati megoldások támogatása Adatok több szintű típusellenőrzése Forrás: Molnár Csaba diasora (Bevezetés)
4
A .NET platform A .NET tulajdonképpen a CLI (Common Language Infrastructure) egy implementációja CLI- szabályrendszer, ami maga is több részre oszlik: CTS CLS VES/CLR
5
CTS – (Common Type System), az adatok kezelését, a memóriában való megjelenést , egymással lévő interakciót, stb. írja le. CLS – (Common Language Specification), A CLI kompatibilis nyelvekkel kapcsolatos elvárásokat tartalmazza VES – (Virtual Execution System), magát a futási környezetet specifikálja. CLR (Common Language Runtime)-nek is szokták nevezni. Sokan virtuális gépként is azonosítják, azonban ez téves. Nincs .NET virtuális gép.
6
CIL- Common Intermediate Language
Ez egy egységes közbenső nyelv/kód, amelyre minden CLI nyelvben megírt kód fordul Korábban MSIL(Microfot Common Intermediate Language)-nek hívták Ezt a CIL kódot a tényleges futás során egy JIT (just in time) fordító alakítja át natív kóddá, amit már a processzor tud kezelni. A CIL hasonlí a Java byte-kódra Forrás: Molnár Csaba diasora (Bevezetés)
7
Osztálykönyvtárak Forrás: Molnár Csaba diasora (Bevezetés)
8
BCL- Base Class Library
Minden .NET Framework által támogatott nyelvből elérhető Rengeteg közös osztályt tartalmaz Részhalmaza a FCL (Framework Class Library)-nek Tulajdonképpen az alapvető feladatok (fájl olvasás-írás, adatbáziskezelés, stb) elvégzéséhez szükséges eszközöket tartalmazza. Az összes többi könyvtár ezekre épül. Forrás: részben Molnár Csaba diasora (Bevezetés)
9
WinForms - felhasználói felület kialakítása
ASP.NET - web programozás ADO.NET – adatelérés támogatása
10
WPF (Windows Presentation Foundation) – Látványos felhasználói felületek kialakítása
WCF (Windows Communication Foundation) – Munkafolyamat által vezérelt alkalmazás készítése WCS (Windows CardSpace) – Internetes erőforrások eléréséhez szükséges azonosítás gyors és biztonságos elérése Forrás: Molnár Csaba diasora (Bevezetés)
11
LINQ (Language Integrated Query) – SQL szerű adatelérést biztosít különböző adatszerkezeteken
ADO.NET Entity Framework – Üzleti alkalmazások és szolgáltatások hatékony fejlesztése
12
C# nyelv A .NET fő programozási nyelve
Professzionális, Neumann-elvű, nagy programok írására is alkalmas nyelv A program több fordítási egységből áll Egy sorba több utasítás is írható Tisztán objektumorientált és komponens orientált nyelv is egyben, típusbiztos, általános felhasználású nyelv Nem létezik nem menedzselt, natív módban futó C# program Rendelkezik szemétgyűjtő mechanizmussal is A mutatók csak unsafe módban használhatóak A destruktorok nem érhetőek el Csak egyszeres öröklés, de több interfész Típusbiztos, azaz egy implicit konverzió, a biztonságos konverzió Tulajdonságok használata Érték illetve referencia típusú változók Nincs mutatóhasználat Függvények – definíciók nem ágyazhatóak egymásba
13
Hierarchikus névterekben használt osztályok
Privát- , statikus – konstruktor Egyszeres öröklés Operátor definiálási lehetőség Kivételkezelés megvalósítása Párhuzamos végrehajtású szálak definiálhatósága
14
A C# nyelv alapjai
15
Szintaktika A C# nyelv C stílusú szintaktikával rendelkezik
Az egyes utasítások végén „ ; ” áll A kis- és nagybetűk különbözőek pl. Alma ≠ alma A program egységeit blokkokkal jelöljük („{„ , „}”)
16
Kulcsszavak
17
A kulcsszavak különleges jelentőséggel bírnak
Az előre meghatározott jelentésükön kívül másra nem használhatóak A legtöbb fejlesztőeszköz megszínezi a kulcsszavakat
18
Speciális kulcsszavak
19
Megjegyzések
20
Névterek Egy modul/osztály tetszőleges névtér része lehet
A névtér egy virtuális doboz, amelyben a logikailag összefüggő osztályok, metódusok és minden más vannak A névtérben fontos, hogy az azonosítónak egyedinek kell lennie A névtér megadása maga nem kötelező, azonban erősen ajánlott Ugyanis, ha nem adjuk meg akkor a névtelen(név nélküli) névtér része lesz a kód Nagyságrendileg kb nevet és azonosítót tartalmaz, ez természetesen folyamatosan nő
21
Névterek használata
22
Változók
23
A C# szigorúan típusos nyelv
Minden változó típusát ismerni kell fordítási időben A változók lehetnek külsők – függvényen kívüliek vagy belsők- függvényen belüliek A belső változók lehetnek dinamikus vagy statikus élettartamúak Dinamikus- automatikus, azaz élettartama a blokkban való tartózkodás idejére korlátozódik. Tehát a végrehajtás befejeztével a dinamikus változók megszűnnek Statikus – ilyen típusú belső változót nem tudunk deklarálni A függvények statikusak, pl a Main függvény
24
A változók két kategóriája
referencia típus – osztály típusú változók, melyek a dinamikus memóriában helyezkednek el értéktípus – nem osztály típusú változók, inicializálás hiányában a fordító 0 értékre állítja be ezeket.
25
Formai megkötések: Deklaráció:
Első karakter betű vagy alulvonás, a többi karakter szám is lehet, ékezetes karakterek szintén megengedettek Deklaráció: Típus változónév; Típus változónév = kezdőérték; Típus változónév1, változónév2 = kezdőérték;
26
Változók (példa)
27
Típusok
28
Típusok folyt.
29
Implicit, nem nevesített típusok (példa)
A metódus hatókörében (lokálisan) deklarált változó típusának meghatározását a fordítóra bízhatjuk Ez nem azt jelenti, hogy nem típusos változót használunk A típus meghatározása értékadáskor történik (deklaráláskor kötelező) A típus nem változtatható meg, de konverziók végrehajthatók Javasolt használata: Névtelen típusok és lekérdezés-kifejezések során (LINQ)
30
Implicit, nem nevesített típusok (példa)
31
Adatok becsomagolása, kibontása (boxing, unboxing)
Minden elemi típushoz tartozik egy referencia típus Akkor szükséges ha valahol referencia típust várunk, azonban értéktípusunk van A becsomagolás implicit, azaz automatikus. A boxing az a folyamat, amely megengedi, egy értéktípusnak, hogy úgy viselkedjen, mint egy referenciatípus. Működése: A rendszer előkészíti az értéktípus valódi típusának megfelelő keretet (dobozt), amely tartalmazza az eredeti változó adatait, illetve az összes szükséges információt, hogy referenciatípusként tudjon működni.
32
A kibontás explicit, azaz ki kell kényszeríteni
A kibontás explicit, azaz ki kell kényszeríteni. Az unboxing a boxing ellentéte. A bedobozolt értéktípusból kinyerjük az eredeti értéket. Nullázható (nullable) típusok esetén a helyzet bonyolódik (később…)
33
Ki- és becsomagolás (példa)
34
Konstansok Kezdőértékkel ellátott adatmezőket és a lokális változókat a const szóval konstanssá tehetjük A konstansoknak egyszer adhatunk értéket, a deklarációnál Mezőneveknél a readonly is használható, de csak osztály szinten, metódusban nem A kettő közti különbség: A const konstanst a fordító értékeli ki A readonly mezők a futás során kapnak értéket, így konstruktorban is inicializálhatóak
35
Konstansok (példa)
36
Felsorolt típus Ez egy olyan adatszerkezet, amely meghatározott értékek névvel ellátott halmazát képviseli Névtérben és osztályban egyaránt elhelyezhetőek Kulcsszava az enum Deklarációja: enum azonosító [:típus] {konst1[=érték], konst2[=érték], …};
37
Ha nem adunk neki értékeket, akkor a nevekhez 0-tól egyesével egész számokat rendel.
A felsorolástípus nevével változókat deklarálunk A típus elemeit a típusnév után ponttal elválasztva érjük el A tagokhoz rendelt egész értéket típuskényszerítéssel kapjuk meg
38
Ha nem egész, hanem bit típusú konstansokra van szükség, akkor a „[Flags]” attribútimmal tudjuk megadni Pl. Ebben az esetben az elemekkel bitműveleteket végezhetünk Természetesen mivel ez a típus a System.Enum megfelelője, ezért rendelkezik annak jellemzőivel is. Két legjellemzőbb: GetHashCode(), ToString()
39
Nullázható típusok (nullable)
A nyelvben megkülönböztetjük az érték és a referencia típusokat A referencia típusok inicializálás előtt null értéket vesznek fel, illetve mi magunk is beállíthatjuk ezt Érték típusoknál alapesetben a változó nem lehet null érték Az érték típus a deklaráció pillanatában nulla értékkel töltődik fel
40
Probléma ? Megoldás Probléma – nem tudjuk, hogy kapott-e már értéket a változó Megoldás – nullázható típus használata Jelölése: Nullable <érték_változó>változónév; érték_változó ? változónév;
41
Nullázható típusok (példa)
42
Kifejezése, műveletek, operátorok
43
Operátorok Programozás során utasításokat adunk a számítógépnek
A kifejezések operátorokból, operandusokból és ezek kombinációjából jönnek létre. Az operátorok lehetnek: Egy- (unáris) Két- (bináris) és Háromoperandusúak (ternáris)
44
Néhány lényegesebb különbség:
A C# és a Java kifejezései és operátorai nagyban hasonlítanak egymáshoz. Néhány lényegesebb különbség: Csonkolt logikai operátorok Alapértelmezett vagy Névtér alias operátor Lambda kifejezés operátora is operátor as operátor typeof operátor
45
„csonkolt” logikai operátor
Ahogy a Java-ban, úgy a C#-ban is megengedett ez az operátor ||->| , &&->& Különbség, hogy a logikai operátorok az eredménytől függetlenül kiértékelik a teljes kifejezést
46
Alapértelmezett vagy Jelölése: ?? A nullázható típusokhoz kötődik
Ha egy változónak még nincs értéke, akkor a jobb oldali operandus értékét veszi fel
47
Névtér alias operátor Jelölése: ::
Általában névterekben dolgozunk, de lehetőségünk van a névtereken kívül is osztályokat elhelyezni Ha a névtérben lévő osztály elfedi a névtéren kívülit, akkor „global::osztálynév” formában érhetjük el
48
Lambda kifejezés operátora
Jelölése: => A lambda kifejezés tulajdonképpen a névtelen metódus elegánsabb változata A kifejezés delegált típust határoz meg, emiatt a használat előtt definiálni kell ilyen változót (Minden lambda kifejezés tartalmaz lambda operátort) Az operátor bal oldalán a bemenő változók, jobb oldalán a bemenetre alkalmazott kifejezés áll
49
is operátor Logikai operátor Futásidejű típus lekérdezésére használjuk
Egy objektumról megmondja, hogy a bal oldali operandus a jobb oldali típusnak változója e
50
as operátor Kétoperandusú típuskényszerítés
A bal oldali kifejezést a jobb oldali referencia típusra alakítja, ha tudja Ha sikertelen az alakítás, akkor null értéket ad eredménynek
51
typeof operátor Típusinformációkhoz tudunk hozzájutni általa
Egy Syste.Type típusú objektumot készít, és ennek az objektumnak a mezőfüggvényeivel és tulajdonságaival tudunk típusinformációhoz jutni Több metódusa és tulajdonsága is van
52
Utasítások
53
Utasítások Az operációs rendszer a Main függvénynek adja át a vezérlést, majd a függvénytörzs egymás után következő utasításait hajtja végre, ezután tér vissza a vezérlés az operációs rendszerhez. A programvezérlés menetét az utasítások szekvenciája szabja meg. Utasítások fajtái – Összetett utasítás Kifejezés utasítás Elágazás utasítás Ciklus utasítás Ugró utasítás
54
Összetett utasítás Ahol elhelyezhetünk utasítást, ott természetesen elhelyezhetünk összetett utasítást is. Az összetett utasítás/blokk kapcsos zárójelek között felsorolt utasítások listája. A blokkban változókat is definiálhatunk, ezek a bokkban lokálisak lesznek. A blokkok tetszőlegesen egymásba ágyazhatóak.
55
Kifejezés utasítás Az utasítás formája : „kifejezés;”
Az utasítás speciális formája, ha elmarad a kifejezés. Ez az üres, vagy nulla utasítás. Természetesen az üres vagy nulla utasításnak nem igazán van sok értelme. C#-ban az utasítások végére minden esetben pontosvessző kerül.
56
Elágazás utasítás Az elágazásoknak kétféle típusa van:
Kétfelé elágazó Többfelé elágazó A kétfelé elágazó utasítás tulajdonképpen az „if” segítségével történik. A többfelé elágazó utasítás pedig a „switch” segítségével.
57
Kétféle elágazás Formája: if (kifejezés) utasítás; if (kifejezés) utasítás; else utasítás; Először a kifejezés értékelődik ki. Majd ha a kifejezés igaz, akkor az utána levő utasítás fog végre hajtódni, ha pedig hamis, akkor az „else” utáni (természetesen, ha van ilyen). Egymásba ágyazásnál az „else” ágat a legutóbbi „if”-hez tartozónak tekinti. Ha az igaz ágon összetett utasítást használunk, akkor nem kell utána pontosvessző. Hiszen ha mégis tennénk, akkor ez az „if” lezárását jelentené, és hibás lenne az utasításunk az „if” nélküli „else” használata miatt.
58
Többirányú elágazás Formája: switch (kifejezés) { case érték1: utasítás1; case érték2: utasítás2; … default: utasítás; }; A „switch” utáni kifejezés nem csak egész, hanem szöveg értékű is lehet. Ha a kifejezés értéke a „case” után megadott értékkel nem egyezik meg, akkor a következő „case” utáni érték vizsgálata következik. Ha pedig egy „case” utáni érték azonos a kifejezés értékével, akkor az ez utáni utasítás hajtódik végre. A „case” belépési pont után csak egy érték adható meg, intervallum vagy több érték megadása nem megengedett. Minden elágazást kötelező valamilyen vezérlésátadással befejezni („break”, „return”), még a „default” ágat is.
59
Ciklus utasítás A ciklus utasításnak 4 formája alkalmazható C#-ban.
while do for foreach
60
„while” ciklus Formája: while (kifejezés) utasítás;
Először értelemszerűen a zárójelben található kifejezés értékelődik ki, s ha igaz, akkor végrehajtásra került az utasítás (ciklusmag). Ezután újra a kifejezés kiértékelése kerül sorra, igaz érték esetén megint a ciklusmag kerül végrehajtásra. Ez addig folytatódik amíg a kifejezés igaz értéket ad eredményül. Ezt nevezik elöltesztelő ciklusnak is. Mivel az utasítás először kiértékeli a kifejezést és csak utána hajtja végre a ciklusmagot.
61
„do-while” ciklus Formája: do utasítás; while(kifejezés);
Az utasítás végrehajtása után kiértékelésre kerül a kifejezés. Amíg a kifejezés igaz értéket ad, addig megismétli az utasítás végrehajtását (ciklusmag). Ezt nevezik hátultesztelő ciklusnak is.
62
„for” ciklus Formája: for(kif1;kif2;kif3) utasítás;
Mindegyik kifejezés elmaradhat, de a kifejezések közötti pontosvessző nem! A kifejezések azért maradhatnak el, mert ha ez megtörténik, akkor a „while” true-ként tekinti a ciklust. A kifejezés egy típusdefiníciós kifejezés utasítás is lehet. kif1: inicializálás (pl. int i=0) kif2: ciklus feltétel (pl. i<10) kif3: ciklusváltozó léptetése (pl. i++) Nevezik számláló ciklusnak is.
63
„foreach” ciklus Formája: foreach(azonosító in adatszerkezet) utasítás; Az azonosítóval végigiterálunk az adatszerkezeten. Azaz, ez az utasítás egyenértékű a vektor-elemeken való végiglépdeléssel. Az azonosító, mint ciklusváltozó felveszi egyenként az adatszerkezet elemeit.
64
Az adatszerkezet lehet:
Tömb Gyűjtemény Objektum, ami: Rendelkezik GetEnumerator() függvénnyel, Definiálja a MoveNext() függvényt, Definiálja a Current tulajdonságot. (vagy objektum, ami megvalósíja az IEnumerable és IEnumerator interfészeket.)
65
GetEnumerator() – eredményül kell adnia azt a típust, amilyen típusú elemeken lépdelünk végig.
MoveNext() – az indexet aktuálisra állítja, és logikai visszatéréssel megadja, hogy van e még maradék elem. Current – az aktuális indexű elemét adja eredményül.
66
Ugró utasítások yield using lock (break) (continue) (return) (goto)
67
„yield” utasítás Általában a „return” vagy a „break” utasítással együtt használjuk: yield return yield break Egy felsorolható adatsorozatban a „yield return” utasítással adhatjuk vissza az elemek aktuális értékét. Az így kapott konstrukciót iterátornak nevezzük.
68
A felsorolhatóságot, iterálhatóságot nem kell feltétlen osztályhoz kötni.
Egy metódus önmagában is teljesítheti a felsorolhatóság követelményét. Így a metódus visszatérési típusa IEnumerable.
69
„using” utasítás Kétféle környezetben szerepelhet:
Direktíva, adott névtér, osztály használata Formája: using névtér_vagy_osztály; Mint külön utasítás. „using”, mint direktíva- Formája: using névtér_vagy_osztály; Hasonló a C# „include” és a Java „import” utasításához. Megmondja a fordítónak, hogy ennek a névtérnek a típusait használja. Használata nélkül teljes névvel is elérhetőek az osztályok. (using System; … Console.Write(); System.Console.Write();)
70
„using”, mint utasítás –
Formája: using(objektum) {utasítások;} Egy ideiglenesen használt objektum esetén a „using” utasítás után a keretrendszer meghívja az objektum „Dispose” metódusát. Fájlműveletek esetén gyakran használt.
71
„using”, mint utasítás (példa)
72
„lock” utasítás Formája: lock(referencia) utasítás;
Többszálú programvégrehajtáskor használatos. Ha egy kritikus utasítás blokk végrehajtásakor egy referencia blokkolására van szükség a biztonságos végrehajtáshoz, akkor ezt a „lock” utasítással tehetjük meg. A „lock” kulcsszó egy referenciát vár, ez pedig jellemzően a „this”, majd utána következik a kritikus blokk. A referenciaként kapott objektumot blokkolja, amíg az utasítás végre nem hajtódik. Pl. lock(this){ i=i+2; }
73
A „lock ” utasítás leggyakrabban használt paramétere a „this”, ha a védett változó vagy függvényutasítás nem statikus. Ha azonban statikus változóról vagy függvényutasításról van szó, akkor a „lock” referenciának az osztály típusát kell megadni.
74
break – hatására befejeződik a legbelső „while”, „do”, „for” vagy „switch” utasítás végrehajtása.
continue – hatására a legbelső while, for, do ciklus utasításokat vezérlő kifejezések kerülnek kiértékelésre. return – a vezérlés visszatér a függvényből, a kifejezés értéke a visszaadott érték. goto – a vezérlés arra a pontra adódik, ahol a címke található.
75
Köszönöm a figyelmet! Felhasznált irodalom: Reiter István – C# programozás lépésről lépésre Molnár Csaba és Varga Ágnes diasorai Reiter István – C# jegyzet Illés Zoltán – Programozás C# nyelven
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.