Vizulis programozs Dr Johanyk Zsolt Csaba http johanyak
Vizuális programozás Dr. Johanyák Zsolt Csaba http: //johanyak. hu Johanyak. csaba@gamf. kefo. hu
Ismétlés Néhány fontosabb nyelvi elem
Tulajdonságok
Tulajdonságok Cél: Korlátozott láthatóságú adattagok beállítási/lekérdezési műveleteinek megoldása egyszerűbb (tömörebb) szintaktikával Számított értékű mező megvalósítása Mikor előnyös? Kevés kód szükséges a hozzáférés szabályozásához A kód nem virtuális J. Zs. Cs. : Vizuális programozás (c) 2016
Elérők (accessors) Tulajdonságelérő "tagfüggvények" class Nyomógomb { private string Felirat; //a háttérben levő korlátozott hozzáférésű adattag public string NFelirat //az adattagot "közzétevő" tulajdonság, ez látható { get { return Felirat; } //lekérdező elérő set { if( value !=null && …) //ellenőrzött beállítás Felirat=value; } } … J. Zs. Cs. : Vizuális programozás (c) 2016
Csak olvasható tulajdonság private int Szélesség; private int Magasság; … public int Terület //számított tulajdonság, nincs mögötte adattag { get { return Szélesség*Magasság; } } //a tulajdonság csak olvasható J. Zs. Cs. : Vizuális programozás (c) 2016
Használat Nyomógomb ng=new Nyomógomb(); … ng. NFelirat="Ok"; //set elérő használata … int Ter=ng. Terület; //get elérő használata J. Zs. Cs. : Vizuális programozás (c) 2016
Jellemzők Nem használható fel metódus ref vagy out paramétereként Nincs címe Lehet statikus Elfedheti ősosztály azonos nevű tagját (new) Lehet virtuális, absztrakt vagy override Megjelenhet egy interfészben J. Zs. Cs. : Vizuális programozás (c) 2016
Jellemzők Nem lehet void A mögötte levő korlátozott láthatóságú tagokat lecserélhetjük a "kifele" mutatott tulajdonság cseréje nélkül Nem vehet át közvetlenül egynél több értéket J. Zs. Cs. : Vizuális programozás (c) 2016
Tulajdonság típusok Írható-olvasható Csak írható static: – Osztályszintű, csak az osztály statikus adataihoz fér hozzá, – Nem hivatkozhat a this-re vagy példány szintű tagokra – Nem lehet virtuális, absztrakt vagy override J. Zs. Cs. : Vizuális programozás (c) 2016
Lazy creation Lazy instantiation, just-in-time creation A háttérben levő korlátozott hozzáférésű mező null kezdőértéket kap Igazi kezdőértéket a tulajdonsághoz történő első hozzáféréskor, pl. olvasáskor kapja meg a get-be beépített inicializáló kód útján J. Zs. Cs. : Vizuális programozás (c) 2016
Automatikus tulajdonság (automatikusan implementált) J. Zs. Cs. : Vizuális programozás (c) 2016
Példaprogram Jelszóbekérő ablak
Indexelők
Indexelő Rokon vonásokat mutat a tulajdonságokkal és a C++ tömbindex operátor átdefiniálásával Cél: Egy objektumnév után illesztve a tömbindex operátort és indexként egy értéket megadva elérjük az objektum egy adattagját, vagy az adattagban tárolt adatok valamelyikét J. Zs. Cs. : Vizuális programozás (c) 2016
Jellemzők Átdefiniálható más indextípust megadva Nem adható át ref vagy out paraméterként Nem lehet statikus J. Zs. Cs. : Vizuális programozás (c) 2016
Példaprogram Asszociatív
Extension method Bővítő metódus Létező osztály kiterjesztése új metódussal az eredeti osztály módosítása nélkül Nem kell származtatott osztályt létrehozni (előnyös sealed osztályoknál) Meghívható az eredeti osztály objektumára http: //msdn. microsoft. com/en-us/library/bb 311042%28 v=vs. 100%29. aspx J. Zs. Cs. : Vizuális programozás (c) 2016
Létrehozás J. Zs. Cs. : Vizuális programozás (c) 2016
Használat J. Zs. Cs. : Vizuális programozás (c) 2016
Virtual példa J. Zs. Cs. : Vizuális programozás (c) 2016 2010 21
Virtuális metódus Futási időben dől el, hogy az osztályhierarchián belüli virtuális metóduslánc melyik tagja hajtódik végre Virtuális metódus nem lehet private A virtual kulcsszó nem használható a static, abstract és override kulcsszavakkal együtt Ha definiálunk a leszármazott osztályban ugyanilyen paraméterszignatúrával egy metódust, akkor azt – a virtuális metóduslánc folytatásának tekintjük (override) – a lánctól független metódusnak tekintjük (new) – új virtuális lánc kezdetének tekintjük (new virtual) J. Zs. Cs. : Vizuális programozás (c) 2016
virtual - override class Szülő {. . . public virtual int Metódus( ) {. . . } public virtual int Adat. Lekér(){ … } } class Gyerek: Szülő {. . . public override int Metódus( ) {. . . } new public int Adat. Lekér(){ … } } J. Zs. Cs. : Vizuális programozás (c) 2016
override A felüldefiniált metódus virtuális vagy absztrakt kell legyen Az override nem változtathatja meg az elem elérési szintjét (public, protected) Nem használható a new, static, virtual, abstract kulcsszavak együtt J. Zs. Cs. : Vizuális programozás (c) 2016
new new-val virtuális metódus is definiálható (a bázis osztályban nem volt virtuális, de az aktuális osztályban és annak leszármazottaiban az) new-val adattag és leszármazott osztály is elfedhető Öröklött metódus vagy adattag elfedése: new kulcsszó J. Zs. Cs. : Vizuális programozás (c) 2016
Lambda kifejezés Egyszerű eszköz inline (névtelen)metódus megvalósítására A fordító egy névtelen metódussal fogja helyettesíteni Implicit típusdef. a parlistában: – (paraméterlista)=>{utasítások} – paraméter=>utasítás Explicit típusdef a parlistában: – (int i)=>3*i J. Zs. Cs. : Vizuális programozás (c) 2016
Lambda kifejezés és implicit típusdefiníció használata Random R=new Random(); List<int> L=new List<int>(); for (int i = 0; i < 20; i++) L. Add(R. Next(1000)); var Páratlanok = L. Find. All(Páratlan); Console. Write. Line("Páratlan számok: " +List 2 Str(Páratlanok)); var Párosok = L. Find. All(i => i%2==0); Console. Write. Line("Páros számok: " + List 2 Str(Párosok)); J. Zs. Cs. : Vizuális programozás (c) 2016
Objektum inicializálás J. Zs. Cs. : Vizuális programozás (c) 2016
Metódusreferencia és eseménykezelés
Metódusreferencia (delegate) Egy speciális változó, ami objektum jegyekkel is rendelkezik Egy metódusra történő hivatkozást tárol, rajta keresztül hívható meg a metódus Funkcióját tekintve hasonló a C++ függvénycímet tárolni képes mutatójához Tartalma futási időben változtatható, különböző időpontokban más és más metódust – akár különböző osztályok tagjait – hívhatunk meg ugyanazon a metódusreferencián keresztül Objektum tag és statikus osztálytag metódus egyaránt meghívható J. Zs. Cs. : Vizuális programozás (c) 2016
Alkalmazás - cél Pl. több osztály/objektum eltérő nevű, de azonos paraméterlistájú és visszatérési értékű metódussal rendelkezik A feladat az, hogy ezeket felváltva, vagy egymás utáni sorozatban meghívjuk A meghívó metódus olyan kell legyen, hogy a rendszer újabb osztályokkal történő bővítése ne igényeljen jelentős kódmódosítást J. Zs. Cs. : Vizuális programozás (c) 2016
Megoldás Egy tömböt/listát hozunk létre, aminek elemei metódusreferenciák lesznek Amikor – egy új objektummal – egy új statikus metódussal bővül a rendszerünk, létrehozunk egy metódusreferenciát, amiben tároljuk az új objektumban (v. osztályban) meghívni kívánt metódus referenciáját, majd a metódusreferenciát felvesszük a listába J. Zs. Cs. : Vizuális programozás (c) 2016
Lépések Metódusreferencia típus deklarálása public delegate visszértéktip Metódus. Referencia. Típus. Név(paraméterlista); Metódusreferencia típusú változó definiálása Metódus. Referencia. Típus. Név MVáltozó; Metódusreferencia objektum létrehozása MVáltozó=new Metódus. Referencia. Típus. Név( objektumnév. metódusnév); objektumnév. metódusnév: meghívandó metódus neve Metódus meghívása: MVáltozó(aktuális paraméterek); J. Zs. Cs. : Vizuális programozás (c) 2016
Metódusreferencia példaalkalmazás J. Zs. Cs. : Vizuális programozás (c) 2016
Esemény Lehetővé teszi, hogy egy objektum más objektumokat értesítsen egy változásról Két szereplő (objektum) típust különböztetünk meg: – Közzétevő (publisher): előidéz egy eseményt, hogy értesítse az összes érdekelt – feliratkozott (subscriber) objektumot – Feliratkozó (subscriber): megad egy metódust, amit meg kell hívni egy esemény bekövetkeztekor, regisztrálja magát közzétevőnél Egy eseményre többen is feliratkozhatnak, de az is előfordulhat, hogy nincs érdeklődő Megvalósítás: metódusreferenciák segítségével J. Zs. Cs. : Vizuális programozás (c) 2016
Megvalósítás Metódusreferencia típus definiálása public delegate void MTípus. Név(paraméterlista); a visszatérési érték típusa void kell legyen A metódusreferencia típuson alapuló esemény definiálása public event MTípus. Név Esemény. Név; J. Zs. Cs. : Vizuális programozás (c) 2016
Megvalósítás Feliratkozás az eseményre az eseménykezelő metódus megadásával Esemény. Név+=new MTípus. Név(objnév. esemkeznév) Vagy Esemény. Név+=objnév. esemkeznév Vagy Esemény. Név+=osztnév. esemkeznév J. Zs. Cs. : Vizuális programozás (c) 2016
Esemény előidézése … if(Esemény. Név!=null) //ha van feliratkozó Esemény. Név(this); … Meghívja sorban az egyes eseménykezelőket A sorrend nem biztos Ha közben kivétel keletkezik, akkor a még „várakozó” eseménykezelők meghívása elmaradhat J. Zs. Cs. : Vizuális programozás (c) 2016
Paraméterek átadása Első paraméter konvencionálisan a közzétevő objektum: object sender, mert egy eseménykezelő több objektum eseményeire is figyelhet A további paramétereket egy objektum adattagjaiként kell átadni, ennek osztálya az Event. Args leszármazottja kell legyen Létre kell hozni hozzá egy osztályt J. Zs. Cs. : Vizuális programozás (c) 2016
Ismétlés Önálló munka
Röviden a. Net platformról
Mit nyújt? biztosítja az eszközöket osztott web alkalmazások fejlesztéséhez nyelvfüggetlen programozási modellt biztosít támogatja a web-es protokollokat (HTTP, XML, XPath, SOAP) ingyenesen letölthető egységes felület, egyazon osztályhierarchia több nyelvből is elérhető egy alkalmazás különböző részeit más célorientált nyelveken is írhatják különböző nyelvekben járatos programozók „olcsón” (kis ráfordítással) képesek együttműködni egy projektben – RAD megvalósítása J. Zs. Cs. : Vizuális programozás (c) 2016
A. NET fejlesztői platform WCF ASP. NET ADO. NET Base Class Library Common Language Runtime J. Zs. Cs. : Vizuális programozás (c) 2016 . NET 2. 0 Windows Forms WCS WWF 3. 0 WPF 3. 5 Entity framework LINQ
Common Language Runtime Osztálykönyvtár-kiszolgálás Szálkezelő COM Marshaler Típusellenőrző Kivételkezelő Biztonsági motor Hibakereső motor IL Natív JIT-fordítók Kódkezelő Osztálybetöltő J. Zs. Cs. : Vizuális programozás (c) 2016 Forrás: [1] Szemétgyűjtő
Használat a programok futtatásához szükség van a keretrendszerre (. Net Framework) a MS jelenleg saját operációs rendszereire fejleszti Mono (www. go-mono. com) 4. 2 J. Zs. Cs. : Vizuális programozás (c) 2016
Fordítás - futtatás A fordítási folyamat eredményeképpen keletkező állomány megtévesztő módon exe kiterjesztést visel, de ez egy bájtkód MS Intermediate Language-ben végrehajtáskor egy JIT fordító állítja elő ebből a gépi kódot J. Zs. Cs. : Vizuális programozás (c) 2016
Felügyelt kód Fordítás és végrehajtás Fordítás Forrás kód (. cs, . vb, …) Nyelvi fordító Kód (IL) + Metaadatok (. dll, . exe) Végrehajtás Szerelvény Natív kód JIT fordító Telepítéskor vagy a metódus első meghívásakor J. Zs. Cs. : Vizuális programozás (c) 2016 Forrás: [1]
Robosztus és biztonságos Felügyelt kód Felügyelt köztes kód: – – Ellenőrizhető – – Processzor és architektúra független – – A kód szigorú típusellenőrzésnek vethető alá Kötelező metainformációk Kiértékelő verem alapú Megszűnnek a leggyakoribb hibaforrások ellenőrizetlen veszélyes típusváltások, mutatóbűvészkedések inicializálatlan változók, tömbből kilógó indexek Kivételkezelés – – Nyelvi szinten és a CLR-ben definiált hibakezelés Integrálódik a Windows strukturált kivételkezelésével is (SEH) J. Zs. Cs. : Vizuális programozás (c) 2016 Forrás: [1]
Robosztus és biztonságos Felügyelt adatok Felügyelt adat – Automatikus élettartam-felügyelet – Minden. NET objektumot a GC takarít el GC: garbage collector – a szemetes – Nincs elfelejtett mutató vagy korai delete hívás a cirkuláris hivatkozások nem okoznak gondot – Modern, önhangoló GC algoritmusok a felhasználói interfész nem akad meg jó szerver oldali átbocsátóképesség J. Zs. Cs. : Vizuális programozás (c) 2016 Forrás: [1]
Fejlesztőeszközök Elvileg akár a jegyzettömbben is megírhatjuk programunkat, és lefordíthatjuk azt a keretrendszerbe beépített csc nevű fordítóval Sharp. Develop – a C# és a VB. NET projektekhez http: //www. icsharpcode. net/Open. Source/SD/ Mono. Develop http: //monodevelop. com J. Zs. Cs. : Vizuális programozás (c) 2016
Sharp. Develop J. Zs. Cs. : Vizuális programozás (c) 2016 http: //www. icsharpcode. net/Open. Source/SD/
ILDASM Visual Studio Tools/ Developer VS 2013 Command Prompt Ildasm J. Zs. Cs. : Vizuális programozás (c) 2016
. Net Reflector Lutz Roeder http: //www. red-gate. com/products/reflector/ 14 napos ingyenes teljesértékű próbaverzió letölthető J. Zs. Cs. : Vizuális programozás (c) 2016
[1] Albert István: Többrétegű architektúrák. NET platformon http: //www. devportal. hu/portal/Detail ed. aspx? News. Id=7365 f 088 -099749 ee-97 c 1 -74 f 3 f 73 fe 65 a J. Zs. Cs. : Vizuális programozás (c) 2016
Változók Érték típusú Referencia típusú: átmenet a C++-os hivatkozás és mutató között, de kisebb a programozó mozgásszabadsága, mint mutatók esetén Mutató használata erősen korlátozott Azonosító: használhatunk ékezetes betűket J. Zs. Cs. : Vizuális programozás (c) 2016
Típusok osztályozása http: //tldp. org/LDP/LGNET/85/ortiz. html J. Zs. Cs. : Vizuális programozás (c) 2016
Value types and reference types in the CTS http: //msdn. microsoft. com/enus/library/ms 173104%28 v=vs. 100%29. aspx J. Zs. Cs. : Vizuális programozás (c) 2016
Beépített típusok álnevei sbyte short ushort int uint long ulong char float double bool decimal Struktúra System. SByte System. Int 16 System. UInt 16 System. Int 32 System. UInt 32 System. Int 64 System. UInt 64 System. Char System. Single System. Double System. Boolean System. Decimal J. Zs. Cs. : Vizuális programozás (c) 2016
A klasszikus induló alkalmazás using System; System. Collections. Generic; System. Linq; System. Text; namespace Konzol. Alkalmazás { class Hello { public static void Main() { Console. Write. Line("Helló világ"); Console. Read. Line(); } } } J. Zs. Cs. : Vizuális programozás (c) 2016
XML dokumentáció generálása VS Enterprise Architect J. Zs. Cs. : Vizuális programozás (c) 2016
Konzol IO - Formázott megjelenítés Console. Write. Line( "{0, -5: X}__{1, 10: F 3}", 100, -555. 8); Eredmény: 64 __ -555. 800 J. Zs. Cs. : Vizuális programozás (c) 2016
Karakt. Jelentés C A számot pénznemként jeleníti meg a helyi pénznem és szokás használatával. D A számot decimális egészként jeleníti meg. E A számot exponenciális (tudományos) jelöléssel jeleníti meg. F A számot fixpontos értékként jeleníti meg. G A számot vagy fixpontos vagy pedig egészként jeleníti meg attól függően, hogy melyik a rövidebb. N A számot ezres elválasztó vesszőkkel jeleníti meg. X A számot hexadecimális jelöléssel jeleníti meg. J. Zs. Cs. : Vizuális programozás (c) 2016
Lokális változókat csak inicializálás után szabad felhasználni, különben fordítási hiba keletkezik Belső blokkban belül nem hozhatunk létre olyan nevű változót, mint amilyet már létrehoztunk a blokkot tartalmazó valamely blokkban J. Zs. Cs. : Vizuális programozás (c) 2016
Foglalt változónév J. Zs. Cs. : Vizuális programozás (c) 2016
Enum enum Napok {Hétfő=1, Kedd, Szerda, Csütörtök, Péntek, Szombat, Vasárnap}; static void Main(string[] args) { int x = (int) Napok. Hétfő; int y = (int) Napok. Péntek; Console. Write. Line("{0, -9} = {1}", Napok. Hétfő, x); Console. Write. Line("{0, -9} = {1}", Napok. Péntek, y); } Console. Read. Line(); Console. Write. Line("A hét hányadik napjának nevére kiváncsi? "); string s. Nap. Szam=Console. Read. Line(); int i. Nap. Szam=Int 32. Parse(s. Nap. Szam); Console. Write. Line("{0}", (Napok)i. Nap. Szam); Console. Read. Line(); J. Zs. Cs. : Vizuális programozás (c) 2016
Feltételes elágazás if – a feltételben csak logikai típusú adat állhat switch – case rész tartalmazhat változó definíciót – case után string és null is szerepelhet – ha több konstansra akarjuk ugyanazt végrehajtani case 1: case 2: case 3: utasítások; break; – ha két case közé akárcsak egyetlen utasítást is írunk, akkor kötelező a break vagy a goto vagy a throw vagy a return vagy egy végtelen ciklus J. Zs. Cs. : Vizuális programozás (c) 2016
foreach /*Project menü/…Properties/Debug/Command Line Arguments */ public static void Main(string[] args) { foreach (string s in args) Console. Write. Line(s); } J. Zs. Cs. : Vizuális programozás (c) 2016
Metódusok és adattagok Más osztály nyilvános statikus metódusának v. adattagjának meghívása: osztálynév. metódusnév(paraméterek); osztálynév. adattagnév Más osztály objektuma nyilvános metódusának meghívása: objektumnév. metódusnév(paraméterek); objektumnév. adattagnév Taghívás osztályon belülről: this. metódusnév(paraméterek); vagy metódusnév(paraméterek); this. adatagnév vagy adatagnév J. Zs. Cs. : Vizuális programozás (c) 2016
Tömb létrehozása Két lépésben: – referencia változó létrehozása: int [, ]x; – definíció: x=new int[5, 3]; Egy lépésben (létrehozás kezdőértékadással): int [, ]z = new int[2, 3] { {1, 2, 3}, {4, 5, 6} }; Tömbre történő hivatkozás átadható paraméterként és lehet visszatérési érték is J. Zs. Cs. : Vizuális programozás (c) 2016
Tömb metódusok int[ ] tmb = {3, 8, 2, 6, 9}; Rendezés: System. Array. Sort(tmb); 8 és 2 törlése: System. Array. Clear(tmb, 1, 2); Másolat: int[ ] masolat=(int [ ])tmb. Clone( ); ha a tömbelemek hivatkozást tartalmaznak, akkor a hivatkozást másolja! Hossz: int hossz=tmb. Get. Length(); Első előfordulás (vagy -1) int hely=System. Array. Index. Of(tmb, 9); J. Zs. Cs. : Vizuális programozás (c) 2016
Paraméterátadás típusok Érték szerinti hívó hívott Referencia típusú hívó hívott formális par. l. (ref int a) aktuális par. l. (ref x) x-et hívás előtt inicializálni kell Kimeneti hívó hívott formális par. l. (out int b) aktuális par. l. (out y) y-t hívás előtt nem kell inicializálni J. Zs. Cs. : Vizuális programozás (c) 2016
Tömbpélda
Szerelvény - Assembly A fordító által automatikusan generált fájl: DLL vagy EXE Két logikai egységből áll: – típusok és erőforrások (pl. képek) halmaza IL kód – ezek kapcsolatát leíró metaadatok (manifest), és egyéb információk a szerelvényről Egy EXE csak a szerelvényben levő modulokat használhatja Kétfajta szerelvénytípus Legkisebb verziókezelési egység Biztonsági határokat szab J. Zs. Cs. : Vizuális programozás (c) 2016
Hozzáférés szabályozás Alapértelmezés: private public: bárhonnan elérhető private: csak osztályon belül protected: saját és leszármazott osztályból (struktúrában nem szerepelhet) internal: a szerelvény tagjaiból érhető el protected internal: a szerelvény tagjaiból és a tartalmazó osztály leszármazottaiból érhető el J. Zs. Cs. : Vizuális programozás (c) 2016
Internal Nincs friend kapcsolat Bármikor hozzáadhatunk egy szerelvényhez modulokat – az osztály kódjának változtatása nélkül hozzáférést adhatunk egy másik osztály számára Az internal alapértelmezett Struktúra tag nem lehet protected vagy protected internal J. Zs. Cs. : Vizuális programozás (c) 2016
Egy osztályba beépíthető Osztály, struktúra, interfész, felsorolás, metódusreferencia (delegate) Beágyazott osztály kívülről csak public hozzáférés engedélyezése esetén érhető el J. Zs. Cs. : Vizuális programozás (c) 2016
Osztályok Az ősosztályban – törzsnélküli metódusokat deklarálnak – ezek a műveletek Minden osztály – legfeljebb egy közvetlen szülőosztállyal rendelkezhet – de több interfészt valósíthat meg Interfész – – nem példányosítható csak műveleteket tartalmazhat nincs láthatóság szabályozás, implicit módon public egy interfésznek lehet egy vagy több szülő interfésze J. Zs. Cs. : Vizuális programozás (c) 2016
using System; Interfész interface IGyakorlat { void Mutat(); } class Próba: IGyakorlat { public void Mutat() { Console. Write. Line("Mutat() metódus implementációja"); } } public static void Main(string[] args) { Osztály o = new Osztály(); o. Mutat(); } J. Zs. Cs. : Vizuális programozás (c) 2016
Interfész C++ absztrakt osztályhoz hasonló Meghatározza, hogy az őt implementáló osztály milyen tagokat kell tartalmazzon mindenképp Ezeken felül további tagokat is tartalmazhat az osztály Nincs láthatóság szabályozás, implicit módon public interface INév { tagok deklarációja; } J. Zs. Cs. : Vizuális programozás (c) 2016
Interfész Ajánlás: az interfésznév kezdődjön I betűvel Az interfészeknél is van származtatás Egy interfésznek több szülő interfésze lehet Az interfész tagját implementáló osztály lehet virtuális Explicit interfész metódus: az implementáció során a neve elé kiírjuk az interfész nevét is VisszÉrték. Típus Interfésznév. Metódusnév(paraméterlista){…} J. Zs. Cs. : Vizuális programozás (c) 2016
Absztrakt osztály és interfész közös jellemzők: – nem példányosítható – nem lehet sealed típusú eltérő tulajdonságok – az AO tartalmazhat implementációt – az AO tartalmazhat nem publikus tagokat – az I csak I-nek lehet leszármazottja – egy osztálynak csak egy osztály jellegű őse lehet, de akárhány I-t implementálhat J. Zs. Cs. : Vizuális programozás (c) 2016
Memória felszabadítás Közvetlen módon nincs (nincs delete) A hivatkozási változónak null értéket adunk A végrehajtás kilép a hivatkozás érvényességi köréből Ha egy objektumra már nincs hivatkozás, a keretrendszer felszabadít – ennek időpontjára nincs garancia J. Zs. Cs. : Vizuális programozás (c) 2016
Objektum megszüntetése szemétgyűjtő mechanizmus 1. lépés: deinicializálás: objektumból memória (finalize) 2. lépés: felszabadítás: foglalt memória szabad memória (halom területén) J. Zs. Cs. : Vizuális programozás (c) 2016
object System. Object A. Net hierarchia minden osztálya ennek leszármazottja Öröklött metódusok: – To. String(): visszaadja a típusnevet – Equals(): megadja, hogy ugyanarra az objektumra vonatkozik-e a hivatkozás – Get. Type(): RTTI kinyerése J. Zs. Cs. : Vizuális programozás (c) 2016
Kikényszerített típuskonverzió érték típusú változóknál Csak a hagyományos „casting” típus használható long Max. Ertek = Int 64. Max. Value; Int 32 Max. Int = (int)Max. Ertek; Console. Write. Line("(int){0}={1}", Max Ertek, Max. Int); J. Zs. Cs. : Vizuális programozás (c) 2016
Típuskonverzió referencia típusú változóknál 1 Egy objektumra vonatkozó referencia mindig átkonvertálható szülő osztály típusú referenciára (explicit vagy implicit módon) Fordítva csak (típus) módon if(objektum is osztálytípus) … Igaz, ha az objektum konvertálható osztálytípusra osztálytípus x=y as osztálytípus; Ha a konverzió lehetséges, akkor végrehajtja, különben null érték kerül x-be. Nem keletkezik kivétel. J. Zs. Cs. : Vizuális programozás (c) 2016
Típuskonverzió referencia típusú változóknál 2 Minden objektum referencia átalakítható egy interfész típusúra, ha az objektum megvalósítja az adott interfészt. Megállapítása is operátorral J. Zs. Cs. : Vizuális programozás (c) 2016
Konstruktor Típusa – Példány konstruktor – Statikus osztály konstruktor Default konstruktor: minden adattagot 0 -ra vagy false-ra inicializál Ha definiálunk egy paraméter nélküli konstruktort, akkor a nem inicializált adattagok megtartják 0 kezdőértéküket J. Zs. Cs. : Vizuális programozás (c) 2016
Statikus osztálykonstruktor Osztály betöltésekor hajtódik végre static kulcsszó Statikus adattagok inicializálása Nem lehet meghívni Láthatósága nem szabályozható Nem vehet át paramétert this kulcsszó nem szerepelhet benne J. Zs. Cs. : Vizuális programozás (c) 2016
Inicializáló lista class Dátum { … public Dátum(int év, int hó, int nap){…} public Dátum(): this(2005, 2, 22){} … } J. Zs. Cs. : Vizuális programozás (c) 2016
Csak olvasható adattag readonly int x=4; // védett mező- futási idejű konstans // kezdőértékadás lehet konstruktorban is const int i=5; //fordítási idejű konstans csak alaptípusokra //definiáláskor kötelező a //kezdőértékadás J. Zs. Cs. : Vizuális programozás (c) 2016
Struktúra konstruktora A fordító mindig létrehoz egy default konstruktort Paraméter nélküli konstruktor nem deklarálható protected konstruktor nem deklarálható Kötelező az összes adattag inicializálása J. Zs. Cs. : Vizuális programozás (c) 2016
Structpélda
String osztály Tartalma nem módosítható String. Builder Valójában System. String Trim(): egy új sztringet állít elő úgy, hogy a végeiről elhagyja a bevezető és záró szóközöket, tabulátorokat Van indexelője J. Zs. Cs. : Vizuális programozás (c) 2016
Bit. Array osztály Minden bitje egy logikai hamis vagy igaz értéket tárol 32 bites int-ekben tárolja a logikai értékeket Az index alsó 5 bitje azonosítja be, hogy az adat az int hányadik bitjébe kerül Az index többi bitje határozza meg, hogy hányadik int-be kerüljön az adat J. Zs. Cs. : Vizuális programozás (c) 2016
Feladat szöveg (16 bit/karakter) tárolása Bit. Array-ként majd visszaállítás önálló tanulmányozásra
Becsomagolás Boxing Lehetővé teszi, hogy egy érték típusú adatot objektumként kezeljünk Pl. érték típusú adatot adunk ott át, ahol a formális paraméterlistában objektum szerepel int a = 35; object csomag=a; J. Zs. Cs. : Vizuális programozás (c) 2016
Kicsomagolás Unboxing int a = 35; object csomag=a; int b=(int)csomag; J. Zs. Cs. : Vizuális programozás (c) 2016
Attribútumok Cél: metaadatok osztályhoz rendelése (komponensek szerkesztésénél hasznosak) futtatható alkalmazások viselkedésének megváltoztatása egy objektumra vonatkozó tranzakció információk kinyerése nem menedzselt kód kezelése J. Zs. Cs. : Vizuális programozás (c) 2016
Az attribútumok értékét legtöbbször a programozó által írt kód állítja elő, így egyfajta dokumentálásnak is tekinthetők. Vannak előre definiált attribútumok Mihez rendelhetünk attribútumot: szerelvény (assembly), modul, osztály , struktúra, enum, konstruktor, metódus, tulajdonság, mező, esemény, interfész, paraméter, visszatérési érték, képviselő J. Zs. Cs. : Vizuális programozás (c) 2016
Helye [attribute (helyzeti paraméterek, paraméternév=érték, …)] az elé a szintaktikai elem elé kell helyezni, amire vonatkozik Példák: [Default. Event("Show. Result")] public class … [Web. Method] [STAThread] static void Main() … J. Zs. Cs. : Vizuális programozás (c) 2016
a helyzeti paraméterek adják a lényegi információt egy programelemhez több attribútum is tartozhat a szerelvényre vonatkozó attribútumokat a using direktívák után és a kód elé kell írni using System; [assembly: CLSCompliant(true)] class … J. Zs. Cs. : Vizuális programozás (c) 2016
Általános előre definiált attribútumok Attribútum Conditiona l Mihez metódus Dll. Import metódus Leírás Ha egy megnevezett szimbólum nincs definiálva, akkor a fordító nem hozza létre a hívást A metódus implementációja a megadott dll-ben nem menedzselt kódként szerepel. Hatására futási időben betöltődik a dll J. Zs. Cs. : Vizuális programozás (c) 2016
COM kapcsolatot támogató előre def. attr. Attribute Com. Import Applicable to Class/Interfa ce Description Indicates that a class or interface definition was imported from a COM type library. Com. Register. Func Method Specifies the method to be tion called when a. NET Framework assembly is registered for use from COM. Com. Unregister. Fu Method Specifies the method to be J. Zs. Cs. : Vizuális programozás (c) 2016 nction called when a. NET
COM kapcsolatot támogató előre def. attr. Disp. Id In Marshal. As Method, field, propert y param eter Indicates which dispatch ID is to be used for the method, field or property. Indicates that the data should be marshaled from the caller to the callee. Field, Specifies how data should parame be marshaled between COM ter, and the managed return environment. values J. Zs. Cs. : Vizuális programozás (c) 2016
COM kapcsolatot támogató előre def. attr. Prog. Id Class Out param Indicates that data should be eter marshaled from the callee back to caller. Interface. Type Specifies which prog ID is to be used for the class. Interfac Specifies whether a e managed interface is IDispatch, IUnknown, or dual when it is exposed to COM. J. Zs. Cs. : Vizuális programozás (c) 2016
Feltételes attribútumok használata lehetővé teszik, hogy egyes metódusokat, pl. változók értékeinek kiíratása csak fejlesztési/hibakeresési időben fordítsunk le feltételek: – a fv. visszatérési értéke legyen void – a fv. nem lehet override – a fv. nem származhat örökölt interfésztől J. Zs. Cs. : Vizuális programozás (c) 2016
Feltételes attr. [conditional("DEBUGGING")] public static void Fv(…) {…} … #define DEBUGGING … Obj. Fv(…); A szimbólum parancssorból is definiálható, és a fv. le lesz fordítva! J. Zs. Cs. : Vizuális programozás (c) 2016
Dll. Import segítségével nem menedzselt kód is meghívható – amit nem a. Net-hez készítettek (C->DLL) using System. Runtime. Interop. Services; . . . public class My. Class( ) { [Dll. Import("My. DLL. dll", Entry. Point="My. Function")] public static extern int My. Function(string param 1); . . . int result = My. Function("Hello Unmanaged Code"); . . . } J. Zs. Cs. : Vizuális programozás (c) 2016
Transaction attr COM+ : olyan objektumok fejlesztése, amelyek elosztott tranzakciókban vehetnek részt – több adatbázist, gépet, komponenst using System. Enterprise. Services; fognak át. . . [Transaction(Transaction. Option. Required)] public class My. Transactional. Component {. . . } J. Zs. Cs. : Vizuális programozás (c) 2016
Attribútumok definiálása meg kell adni, hogy mire vonatkozóan akarunk attribútumot létrehozni (érvényességi kör) [Attribute. Usage(Attribute. Targets. Method)] public class My. Attribute: System. Attribute {. . . } [Attribute. Usage(Attribute. Targets. Class | Attribute. Targets. Struct)] public class My. Attribute: System. Attribute {. . . } J. Zs. Cs. : Vizuális programozás (c) 2016
Mire lehet Class, Constructor, Delegate, Enum, Event, Field, Inte rface, Method, Module, Parameter, Property, Return. V alue, Struct, Assembly, All Konvenció: az attribútumot definiáló osztály nevének vége legyen Attribute public class Developer. Info. Attribute: System. Attribute {. . . public Developer. Info. Attribute(string developer) {. . . } public string Date { get {. . . } set {. . . } } } J. Zs. Cs. : Vizuális programozás (c) 2016
Szabályok kell legyen konstruktora (csak egy lehet), ami beállítja a kötelező információt – a helyzeti paraméter(ek) adják át opcionális paraméterekhez használjunk névvel ellátott paramétereket az attribútum osztály használhat tulajdonságokat adatok beállítására vagy lekérdezésére J. Zs. Cs. : Vizuális programozás (c) 2016
[XAttribute("Géza", Dátum="1980 -0507")] public class Oszt. Név {… } J. Zs. Cs. : Vizuális programozás (c) 2016
Saját definiálású attribútum feldolgozása Ha a fordító egy programelemre vonatkozó attribútumot talál, akkor 1. megkeresi az attribútum osztályt 2. ellenőrzi az érvényességi kört 3. megkeresi az attr konstruktorát 4. létrehoz egy objektumpéldányt 5. névvel ellátott paramétereket keres 6. a mezőket vagy tulajdonságokat beállítja a névvel ellátott paraméter értéke 7. lementi az attr osztály aktuális állapotát J. Zs. Cs. : Vizuális programozás (c) 2016
Saját definiálású attribútum feldolgozása egy programelem több attribútummal is rendelkezhet, ezeket külön kell definiálni egy attribútum többször is szerepelhet egy programelemhez kapcsolódóan, ilyenkor az érvényességi körnél meg kell adni az Allow. Multiple=true-t J. Zs. Cs. : Vizuális programozás (c) 2016
[Transaction(Transaction. Option. Required)] [Default. Property("Balance")] public class Financial. Component: System. Attribute {. . . public long Balance {. . . } } J. Zs. Cs. : Vizuális programozás (c) 2016
[Attribute. Usage(Attribute. Targets. Class, Allow. Multiple=true)] public class Developer. Info. Attribute: System. Attribute {. . . } J. Zs. Cs. : Vizuális programozás (c) 2016
Metaadatok felhasználása a lekérdezési mechanizmus neve: Reflection using System. Reflection; … Member. Info[] mi. Tomb; typeof(My. Class). Get. Members( ); . . . J. Zs. Cs. : Vizuális programozás (c) 2016
Attribútum információk lekérdezése. . . object [ ] attrs = type. Info. Get. Custom. Attributes(false); foreach(Attribute atr in attrs) { if (atr is Developer. Info. Attribute) { Developer. Info. Attribute dia = (Developer. Info. Attribute)atr; Console. Write. Line("{0} {1}", dia. Developer, dia. Date); } }. . . J. Zs. Cs. : Vizuális programozás (c) 2016
Öröklődés Az öröklődés mechanizmusa a C++-beli publicnak felel meg Ha egy osztályt sealed jelzővel látnak el, akkor nem lehet szülőosztály (nem származtathatunk belőle) Struktúránál nincs öröklődés Ha egy metódus paraméterként átvesz egy hivatkozást egy szülő osztályra, akkor annak csak a public tagjaihoz fér hozzá Szülő osztály konstruktorának meghívása: base(paraméterlista) J. Zs. Cs. : Vizuális programozás (c) 2016
Sealed módosító beállítása J. Zs. Cs. : Vizuális programozás (c) 2016
Szülő osztály konstruktorának meghívása class Szülő { protected Szülő(string paraméter) {. . . } class Gyerek: Szülő { public Gyerek(string paraméter) : base(paraméter) { }. . . } J. Zs. Cs. : Vizuális programozás (c) 2016
Öröklődés A szülő osztály egy tagjára a base. tagnév alakban hivatkozhatunk (pl. ha a leszármazott osztály felüldefiniálta) Virtuális metódus: public virtual (nem lehet private vagy static) – ősosztályban: virtual – leszármazottban: override (nem lehet private vagy virtual) J. Zs. Cs. : Vizuális programozás (c) 2016
Öröklődés példa J. Zs. Cs. : Vizuális programozás (c) 2016
Operátorok átdefiniálása Az operátorokat a fordító metódushívásokká alakítja Nem lehet: értékadó operátor Lehet: relációs, logikai (nem közvetlenül), konverziós, aritmetikai, bitléptető J. Zs. Cs. : Vizuális programozás (c) 2016
Relációs operátorok Mindig párosával kell átdefiniálni (< és >, <= és >=, == és !=) Az Equals és a Get. Hash. Code metódusokat is át kell definiálni az egyenlőségvizsgálatnál Get. Hash. Code: eredetileg arra szolgál, hogy egy objektum példányt beazonosítsunk egy hash táblában tárolt érték alapján. Az Equals által azonosnak minősített két objektum azonos hash kóddal kell rendelkezzen, ezért kell ezt a metódust is átírni. J. Zs. Cs. : Vizuális programozás (c) 2016
Példa az operátor átdefiniálásra Datum. Kezelo J. Zs. Cs. : Vizuális programozás (c) 2016
Logikai operátorok && és || nem definiálható át közvetlenül, de a kiértékelésüknél használt &, |, true, false viszont igen Ha x és y T típusú, akkor x&&y esetén T. false(x)? x: T. &(x, y) X||y esetén T. true(x)? x: T. |(x, y) Példaalkalmazás J. Zs. Cs. : Vizuális programozás (c) 2016
Példa: Logikai operátorok átdefiniálása J. Zs. Cs. : Vizuális programozás (c) 2016
Konveziós operátorok Explicit, ha kivételt idézhet elő vagy adatvesztéssel járhat Explicit konverzió csak a konverziós operátorral idézhető elő (casting) Implicit, ha biztosan jól és adatvesztés nélkül működik J. Zs. Cs. : Vizuális programozás (c) 2016
Példa Dátumkonverzió
public static explicit operator Datum(int napok) { Datum d=new Datum(0, 0, 0); if(napok<=0) throw new Invalid. Cast. Exception ("A napok száma negatív értéknek lett megadva. "); d. Ev=napok/365; d. Nap=napok-d. Ev*365; d. Ho=0; while(d. Nap>0) { d. Ho++; d. Nap-=Honapok[d. Ho-1]; } d. Nap+=Honapok[d. Ho-1]; return d; } Datum d 4=(Datum)731878; J. Zs. Cs. : Vizuális programozás (c) 2016
Kivételek és kezelésük
Hiba-leállás Ctrl+F 5 Hibás adat Nem kezelt kivétel J. Zs. Cs. : Vizuális programozás (c) 2016
Hiba-leállás F 5 Hibás Adat Nem kezelt kivétel J. Zs. Cs. : Vizuális programozás (c) 2016
Cél: hibakezelés új adatok bekérésével J. Zs. Cs. : Vizuális programozás (c) 2016
Kivételosztályok J. Zs. Cs. : Vizuális programozás (c) 2016
Milyen kivételek következhetnek be? Súgó Gyorstipp J. Zs. Cs. : Vizuális programozás (c) 2016
Felkészülés többfajta kivétel kezelésére Minden hibatípushoz külön catch blokk Közös catch blokk általánosabb kivételosztállyal Általános catch blokk J. Zs. Cs. : Vizuális programozás (c) 2016
Kivétel továbbadása - A finally blokk használata J. Zs. Cs. : Vizuális programozás (c) 2016
Kivételek előidézése if (perc < 1 || perc >= 60) { throw new Invalid. Time. Exception(perc + " érvénytelen percérték"); // !! ide már nem jut el a vezérlés !! } J. Zs. Cs. : Vizuális programozás (c) 2016
Aritmetikai túlcsordulás alapértelmezés szerint nincs ellenőrizve programban utasításra checked { int szam = int. Max. Value; Console. Write. Line(++szam); // Overflow. Exception } unchecked { int szam = int. Max. Value; Console. Write. Line(++szam); //-2147483648 } programban kifejezésre: (checked(++szam)) J. Zs. Cs. : Vizuális programozás (c) 2016
Példa Egyszerű kivételkezelés Faktoriálisszámítás kivételkezeléssel J. Zs. Cs. : Vizuális programozás (c) 2016
Visszatekintés (Reflection) Egy objektum típusáról, tagjairól nyerhetünk információt System. Reflection névtér System. Type osztály: típusazonosság vizsgálata typeof operátor: csak a fordítási időben már létező osztályokon működik J. Zs. Cs. : Vizuális programozás (c) 2016
typeof using System; using System. Reflection; … Type típus=typeof(int); Method. Info[ ] metódusok=típus. Get. Methods(); foreach (Method. Info mi in metódusok) Console. Write. Line(mi); Console. Read. Line(); J. Zs. Cs. : Vizuális programozás (c) 2016
- Slides: 146