Néhány fontosabb nyelvi elem

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

Osztály leszármaztatás
Krizsán Zoltán iit 1.1.  Aszinkron történésről értesítés egy vagy több objektum számára.  Delegátumok segítségével valósítja meg a C#.  event típus,
Felhasználói felületek és üzleti logika Bollobás Dávid ASP.NET
C++ programozási nyelv Gyakorlat hét
Programozás III KOLLEKCIÓK 2..
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Adatbányászati technikák (VISZM185)
Öröklődés 2..
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Programozás alapjai.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
Bevezetés a Java programozásba
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Mutatók, tömbök, függvények
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 5. rész – Osztályok III.
WEB Technológiák Dr. Pance Miklós – Kolcza Gábor Miskolci Egyetem.
C# Alapok Krizsán Zoltán.
C# tagfüggvények.
JSP és JavaBean JavaServer Pages és Java Beans Fabók Zsolt Általános Informatikai Tanszék Miskolci Egyetem.
C# osztályok Krizsán Zoltán 1.0.
C# osztályok Krizsán Zoltán 1.1.
C# tagfüggvények.
Krizsán Zoltán iit 1.2.  Nem kell vizuális felületnek lennie.  Delegátumok segítségével valósíthatja meg a.NET. Krizsán Zoltán iit Delegátumok C#-ban2.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
Vizuális és web programozás II.
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
P ROGRAMOZÁS C# - BAN Kivételkezelés. P ÉLDA I. Nullával való osztás miatt kapjuk a hibaüzenetet.
Összetett adattípusok
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
Java programozási nyelv Metódusok
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
A Visual Basic nyelvi elemei
HTML ÉS PHP (Nagyon) rövid áttekintés. ADATBÁZISRENDSZEREK MŰKÖDÉSI SÉMÁJA Felh. interakció DB Connector MySQL ? A gyakorlaton:
Programozás III KIVÉTEL.
Ficsor Lajos A C++ programozási nyelv I. CPP1/ 1 Osztály és objektum fogalma.
Haladó Programozás Reflexió OE-NIK HP.
DLL használata és készítése Feladat
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
a programegységek között
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Függvénysablonok használata
Előadás másolata:

Néhány fontosabb nyelvi elem Ismétlés Néhány fontosabb nyelvi elem

Tulajdonságok

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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 Nem vehet át közvetlenül egynél több értéket (csak struktúrába/objektumba csomagolva) J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Tulajdonság típusok Írható-olvasható Csak 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

Automatikus tulajdonság (automatikusan implementált) J.Zs.Cs.: Vizuális programozás (c) 2013

Példaprogram Jelszóbekérő ablak

Indexelők

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

Példaprogram Asszociatív

J.Zs.Cs.: Vizuális programozás (c) 2013 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/bb311042%28v=vs.100%29.aspx J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Létrehozás Az osztály neve alaposztály+Extension alakú konvencionálisan. J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Használat J.Zs.Cs.: Vizuális programozás (c) 2013

Virtual példa J.Zs.Cs.: Vizuális programozás (c) 2010

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 virtual - override class Szülő { ... public virtual int Metódus( ) { ... } public virtual int AdatLekér(){ … } } class Gyerek: Szülő public override int Metódus( ) { ... } new public int AdatLekér(){ … } A Metódus virtuális láncot folytatjuk a leszármazott osztályban. Az AdatLekér a leszármazottban egy lánctól független metódus, ami elfedi a szülő osztályban definiálkt virtuális azonos nevű metódust. J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2012 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 Mi a lambda kifejezés? Milyen típusdefiníció kifejezések fordulhatnak elő a lambda kifejezés paraméterlistájában? Írjon egy-egy példát ezekre úgy, hogy a példákban teljes lambda kifejezés szerepeljen, ne csak a típusdefiníció. Magyarázza el, hogy mi történik a példa kifejezésekben/mi a feladatuk. J.Zs.Cs.: Vizuális programozás (c) 2012

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.FindAll(Páratlan); Console.WriteLine("Páratlan számok: " +List2Str(Páratlanok)); var Párosok = L.FindAll(i => i%2==0); Console.WriteLine("Páros számok: " + List2Str(Párosok)); J.Zs.Cs.: Vizuális programozás (c) 2013

Objektum inicializálás J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Lépések Metódusreferencia típus deklarálása public delegate visszértéktip MetódusReferenciaTípusNév(paraméterlista); Metódusreferencia típusú változó definiálása MetódusReferenciaTípusNév MVáltozó; Metódusreferencia objektum létrehozása MVáltozó=new MetódusReferenciaTípusNé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); A Metódusreferencia típus deklarálása az osztályon kívül történhet. Itt azt adjuk meg, hogy milyen szignatúrájú (paraméterlista és visszatérési érték) metódusokra történő hivatkozást tárolhatunk majd az ilyen típusú változókban. J.Zs.Cs.: Vizuális programozás (c) 2013

Metódusreferencia példaalkalmazás J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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 Az esemény egy üzenet, ami valaminek a bekövetkezéséről tájékoztat. Ilyenkor az alkalmazás egyes részei lehetőséget kapnak arra, hogy reagáljanak az eseményre ún. eseménykezelő metódusok végrehajtásával. Példák eseményekre: Tick – a Timer komponensnél lejárt az előre beállított időtartam Click – a felhasználó kattintott pl. egy nyomógombon MouseMove – egér mozgatása Changed – az állományrendszer megfigyelt részében változás állt be A komponensekhez kapcsolódó (beépített) eseményeken kívül a programozó is definiálhat saját eseményeket saját definiálású osztályában. Az esemény az osztály egy tagja. J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Megvalósítás Metódusreferencia típus definiálása public delegate void MTípusNé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ípusNév EseményNév; A metódusreferencia típus definiálása történhet az osztályon kívül. A metódusreferencia típuson alapuló esemény az osztály egy tagja lesz. Ez mindig public hozzáférésű kell legyen. J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Megvalósítás Feliratkozás az eseményre az eseménykezelő metódus megadásával EseményNév+=new MTípusNév(objnév.esemkeznév) Vagy EseményNév+=objnév.esemkeznév EseményNév+=osztnév.esemkeznév Feliratkozáskor először létrehozunk egy metódusreferencia objektumot benne megadva a hivatkozott metódust, majd ezt hozzárendeljük az eseményhez. J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Esemény előidézése … if(EseményNév!=null) //ha van feliratkozó EseményNé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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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 EventArgs leszármazottja kell legyen Létre kell hozni hozzá egy osztályt J.Zs.Cs.: Vizuális programozás (c) 2013

Röviden a .Net platformról

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

A .NET fejlesztői platform LINQ Entity framework 3.5 WPF WCF WWF WCS 3.0 Windows Forms ASP.NET ADO.NET .NET 2.0 WWF-Windows Workflow Foundation WCD – Windows Card Space Base Class Library Common Language Runtime J.Zs.Cs.: Vizuális programozás (c) 2013

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ő Szemétgyűjtő Osztálybetöltő J.Zs.Cs.: Vizuális programozás (c) 2013 Forrás: [1]

J.Zs.Cs.: Vizuális programozás (c) 2013 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 MS Rotor - FreeBSD Mono (www.go-mono.com) 2.6.3 DotGnu (www.gnu.org/projects/dotgnu) 0.1 J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

Felügyelt kód Fordítás és végrehajtás Forrás kód (.cs, .vb, …) Nyelvi fordító Kód (IL) + Metaadatok (.dll, .exe) Végrehajtás IL nem interpretált “Econo” JIT optimalizálatlan natív kódot generál eldobható és újragenerálható kód (Edit&Continue) “Standard” JIT optimalizáló kódgenerátor verifikálja az IL kódot Fordítás telepítéskor futtatás előtt végrehajtódik gyorsítja az indulást Közös nyelvi specifikáció (CLS) Minden nyelvhez más fordító Azonos kimenet: IL Azonos szolgáltatások: Nyelvek közti származtatás, kivételek, ... Kód ellenőrzés, típus kompatibilitás Debug szimbólumok Teljesítmény mutatók JIT fordító Szerelvény Natív kód Telepítéskor vagy a metódus első meghívásakor J.Zs.Cs.: Vizuális programozás (c) 2013 Forrás: [1]

Robosztus és biztonságos Felügyelt kód Felügyelt köztes kód: Ellenőrizhető Kötelező metainformációk Processzor és architektúra független Kiértékelő verem alapú A kód szigorú típusellenőrzésnek vethető alá 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) 2013 Forrás: [1]

Robosztus és biztonságos Felügyelt adatok 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) 2013 Forrás: [1]

J.Zs.Cs.: Vizuális programozás (c) 2013 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 SharpDevelop 3.2 – a C# és a VB.NET projektekhez http://www.icsharpcode.net/OpenSource/SD/ MonoDevelop 2.2 http://monodevelop.com J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 SharpDevelop J.Zs.Cs.: Vizuális programozás (c) 2013 http://www.icsharpcode.net/OpenSource/SD/

J.Zs.Cs.: Vizuális programozás (c) 2013 ILDASM Start menü/Programok/ Microsoft Visual Studio 2008/ Visual Studio Tools/ Visual Studio 2008 Command Prompt J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 .Net Reflector Lutz Roeder http://www.red-gate.com/products/reflector/ J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 [1] Albert István: Többrétegű architektúrák .NET platformon http://www.devportal.hu/portal/Detailed.aspx?NewsId=7365f088-0997-49ee-97c1-74f3f73fe65a J.Zs.Cs.: Vizuális programozás (c) 2013

Windows Kernel Services Windows 8 platform Metro style Apps Desktop Apps C C++ Win32 C# VB .NET & SL HTML JavaScript IE 10 XAML JavaScript HTML / CSS C++ C# VB DirectX Communication & Data Devices & Printing WinRT APIs Graphics & Media Application Model Windows Kernel Services

Windows Kernel Services Desktop alkalmazások .NET 4.5 (C#, VB) WPF 4.5 Silverlight 5 XNA WinForms C/C++ Win32 Web HTML, JS IE 10 Stb... Metro style Apps Desktop Apps C C++ Win32 C# VB .NET HTML JavaScript IE 10 XAML JavaScript HTML / CSS C++ C# VB DirectX WinRT APIs Communication & Data Graphics & Media Devices & Printing Application Model Windows Kernel Services

Metro stílusú alkalmazások .NET 4.5 (C#, VB) XAML (DirectX) C++ DirectX HTML/CSS + JS Filozófia: „Válaszd azt, amihez értesz!” Metro style Apps Desktop Apps XAML JavaScript HTML / CSS C++ C# VB DirectX HTML JavaScript IE 10 C C++ Win32 C# VB .NET WinRT APIs „Válaszd azt, amihez értesz!”: Webes fejlesztő fejleszthet HTML-ben, .NET-es C#-ban, C++ natívan. Hasonló a lefedettség a különböző nyelvek között, kb. ugyan azt meg lehet csinálni minden nyelven (persze kivétel DirectX, stb..). Communication & Data Graphics & Media Devices & Printing Application Model Windows Kernel Services

Ismétlés Önálló munka

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Típusok osztályozása http://tldp.org/LDP/LGNET/85/ortiz.html J.Zs.Cs.: Vizuális programozás (c) 2013

Value types and reference types in the CTS http://msdn.microsoft.com/en-us/library/ms173104%28v=vs.100%29.aspx J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Beépített típusok Beépített típusok álnevei Struktúra sbyte System.SByte byte System.Byte short System.Int16 ushort System.UInt16 int System.Int32 uint System.UInt32 long System.Int64 ulong System.UInt64 char System.Char float System.Single double System.Double bool System.Boolean decimal System.Decimal J.Zs.Cs.: Vizuális programozás (c) 2013

A klasszikus induló alkalmazás using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace KonzolAlkalmazás { class Hello { public static void Main() { Console.WriteLine("Helló világ"); Console.ReadLine(); } Névtér fogalma Osztály megadás a teljes elérési úttal Using használata Tagkiválasztó operátor. Statikus metódus fogalma. J.Zs.Cs.: Vizuális programozás (c) 2013

XML dokumentáció generálása VS Enterprise Architect J.Zs.Cs.: Vizuális programozás (c) 2013

Konzol IO - Formázott megjelenítés Console.WriteLine( "{0,-5:X}__{1,10:F3}", 100,-555.8); Eredmény: 64 __ -555.800 J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Lokális változók 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Foglalt változónév J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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.WriteLine("{0,-9} = {1}",Napok.Hétfő,x); Console.WriteLine("{0,-9} = {1}",Napok.Péntek,y); Console.ReadLine(); Console.WriteLine("A hét hányadik napjának nevére kiváncsi? "); string sNapSzam=Console.ReadLine(); int iNapSzam=Int32.Parse(sNapSzam); Console.WriteLine("{0}",(Napok)iNapSzam); } Felsorolás típus J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 foreach /*Project menü/…Properties/Debug/Command Line Arguments */ public static void Main(string[] args) { foreach (string s in args) Console.WriteLine(s); } Egy új ciklusfajta J.Zs.Cs.: Vizuális programozás (c) 2013

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 Tagkiválasztó operátor mindig a pont. Bár a kis és nagybetűs neveket megkülönbözteti, de a CLR nem támogatja, hogy egy osztályon belül olyan metódusokat definiáljunk, amelyek csak betűtípusban különböznek. J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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.GetLength(); Első előfordulás (vagy -1) int hely=System.Array.IndexOf(tmb,9); J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

Tömbpélda

J.Zs.Cs.: Vizuális programozás (c) 2013 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 Az első sikeres fordításkor keletkezik. Ezután minden újrafordítást követően a fejlesztőrendszer frissíti, azaz kiegészíti és nem generálja újra. A manifest tartalmazza pl. a verziószámot. Kétfajta szerelvénytípus létezik: egyállományos (IL+metaadat+manifest egy helyen) ez az általános több állományos (egy szerelvényben van a manifest, a többiben IL és metaadatok) A szerelvény különböző verziói is jelen lehetnek egyszerre. J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Interfész using System; interface IGyakorlat { void Mutat(); } class Próba:IGyakorlat { public void Mutat() { Console.WriteLine("Mutat() metódus implementációja"); public static void Main(string[] args) { Osztály o = new Osztály(); o.Mutat(); Az interfész egy osztályhoz hasonlít. Tartalmazhat: eseményeket, indexelőket, metódusokat és tulajdonságokat. Viszont nem rendelkezik implementációs résszel. Az interfészt osztályok és struktúrák "öröklik", azaz implementálják. Ez azt jelenti, hogy az öröklési kapcsolattal kikényszerítjük az interfészben deklarált tagok implementációját. Ez egyfajta szerződés, azzal, hogy kijelentjük, hogy A Próba osztály implementálja az IGyakorlat interfészt, kötelezettséget vállalunk arra, hogy lesz egy Mutat metódus. A tagok elérhetősége nyilvános. J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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ékTípus Interfésznév.Metódusnév(paraméterlista){…} J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

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) 2013

Objektum megszüntetése szemétgyűjtő mechanizmus lépés: deinicializálás: objektumból  memória (finalize) lépés: felszabadítás: foglalt memória  szabad memória (halom területén) J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 object  System.Object A .Net hierarchia minden osztálya ennek leszármazottja Öröklött metódusok: ToString(): visszaadja a típusnevet Equals(): megadja, hogy ugyanarra az objektumra vonatkozik-e a hivatkozás GetType(): RTTI kinyerése J.Zs.Cs.: Vizuális programozás (c) 2013

Kikényszerített típuskonverzió érték típusú változóknál Csak a hagyományos „casting” típus használható long MaxErtek = Int64.MaxValue; Int32 MaxInt = (int)MaxErtek; Console.WriteLine("(int){0}={1}",MaxErtek, MaxInt); J.Zs.Cs.: Vizuális programozás (c) 2013

Típuskonverzió referencia típusú változóknál1 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) 2013

Típuskonverzió referencia típusú változóknál2 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

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) 2013

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) 2013

Structpélda

J.Zs.Cs.: Vizuális programozás (c) 2013 String osztály Tartalma nem módosítható  StringBuilder 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 BitArray 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) 2013

Feladat szöveg (16 bit/karakter) tárolása BitArray-ként majd visszaállítás önálló tanulmányozásra

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Kicsomagolás Unboxing int a = 35; object csomag=a; int b=(int)csomag; J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Helye [attribute (helyzeti paraméterek, paraméternév=érték, …)] az elé a szintaktikai elem elé kell helyezni, amire vonatkozik Példák: [DefaultEvent("ShowResult")] public class … [WebMethod] [STAThread] static void Main() … J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

Általános előre definiált attribútumok Mihez Leírás Conditional metódus Ha egy megnevezett szimbólum nincs definiálva, akkor a fordító nem hozza létre a hívást DllImport 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) 2013

COM kapcsolatot támogató előre def. attr. Attribute Applicable to Description ComImport Class/Interface Indicates that a class or interface definition was imported from a COM type library. ComRegisterFunction Method Specifies the method to be called when a .NET Framework assembly is registered for use from COM. ComUnregisterFunction Specifies the method to be called when a .NET assembly is unregistered for use from COM. J.Zs.Cs.: Vizuális programozás (c) 2013

COM kapcsolatot támogató előre def. attr. DispId Method, field, property Indicates which dispatch ID is to be used for the method, field or property. In parameter Indicates that the data should be marshaled from the caller to the callee. MarshalAs Field, parameter, return values Specifies how data should be marshaled between COM and the managed environment. J.Zs.Cs.: Vizuális programozás (c) 2013

COM kapcsolatot támogató előre def. attr. ProgId Class Specifies which prog ID is to be used for the class. Out parameter Indicates that data should be marshaled from the callee back to caller. InterfaceType Interface Specifies whether a managed interface is IDispatch, IUnknown, or dual when it is exposed to COM. J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 DllImport segítségével nem menedzselt kód is meghívható – amit nem a .Net-hez készítettek (C->DLL) using System.Runtime.InteropServices; ... public class MyClass( ) { [DllImport("MyDLL.dll", EntryPoint="MyFunction")] public static extern int MyFunction(string param1); int result = MyFunction("Hello Unmanaged Code"); } J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Transaction attr COM+ : olyan objektumok fejlesztése, amelyek elosztott tranzakciókban vehetnek részt – több adatbázist, gépet, komponenst fognak át using System.EnterpriseServices; ... [Transaction(TransactionOption.Required)] public class MyTransactionalComponent { } J.Zs.Cs.: Vizuális programozás (c) 2013

Attribútumok definiálása meg kell adni, hogy mire vonatkozóan akarunk attribútumot létrehozni (érvényességi kör) [AttributeUsage(AttributeTargets.Method)] public class MyAttribute: System.Attribute { ... } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public class MyAttribute: System.Attribute { ... } J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Mire lehet Class,Constructor,Delegate,Enum,Event,Field,Interface,Method,Module,Parameter,Property,ReturnValue,Struct,Assembly,All Konvenció: az attribútumot definiáló osztály nevének vége legyen Attribute public class DeveloperInfoAttribute: System.Attribute { ... public DeveloperInfoAttribute(string developer) { ... } public string Date { get { ... } set { ... } } J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 [XAttribute("Géza", Dátum="1980-05-07")] public class OsztNév { … } J.Zs.Cs.: Vizuális programozás (c) 2013

Saját definiálású attribútum feldolgozása Ha a fordító egy programelemre vonatkozó attribútumot talál, akkor megkeresi az attribútum osztályt ellenőrzi az érvényességi kört megkeresi az attr konstruktorát létrehoz egy objektumpéldányt névvel ellátott paramétereket keres a mezőket vagy tulajdonságokat beállítja a névvel ellátott paraméter értéke lementi az attr osztály aktuális állapotát J.Zs.Cs.: Vizuális programozás (c) 2013

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 AllowMultiple=true-t J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 [Transaction(TransactionOption.Required)] [DefaultProperty("Balance")] public class FinancialComponent: System.Attribute { ... public long Balance } J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 [AttributeUsage(AttributeTargets.Class, AllowMultiple=true)] public class DeveloperInfoAttribute: System.Attribute { ... } J.Zs.Cs.: Vizuális programozás (c) 2013

Metaadatok felhasználása a lekérdezési mechanizmus neve: Reflection using System.Reflection; … MemberInfo[] miTomb; typeof(MyClass).GetMembers( ); ... J.Zs.Cs.: Vizuális programozás (c) 2013

Attribútum információk lekérdezése ... object [ ] attrs = typeInfo.GetCustomAttributes(false); foreach(Attribute atr in attrs) { if (atr is DeveloperInfoAttribute) { DeveloperInfoAttribute dia = (DeveloperInfoAttribute)atr; Console.WriteLine("{0} {1}", dia.Developer, dia.Date); } J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Ö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) 2013

Sealed módosító beállítása J.Zs.Cs.: Vizuális programozás (c) 2013

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) { } Ha nem hívjuk meg explicit módon a szülő osztály valamely konstruktorát, akkor a fordító meghívja a szülő osztály paraméter nélküli konstruktorát J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Ö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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Öröklődés példa J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Relációs operátorok Mindig párosával kell átdefiniálni (< és >, <= és >=, == és !=) Az Equals és a GetHashCode metódusokat is át kell definiálni az egyenlőségvizsgálatnál GetHashCode: 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) 2013

Példa az operátor átdefiniálásra DatumKezelo J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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 7.11.2 User-defined conditional logical operators When the operands of && or || are of types that declare an applicable user-defined operator & or operator |, both of the following must be true, where T is the type in which the selected operator is declared: The return type and the type of each parameter of the selected operator must be T. In other words, the operator must compute the logical AND or the logical OR of two operands of type T, and must return a result of type T. T must contain declarations of operator true and operator false. A compile-time error occurs if either of these requirements is not satisfied. Otherwise, the && or || operation is evaluated by combining the user-defined operator true or operator false with the selected user-defined operator: The operation x && y is evaluated as T.false(x) ? x : T.&(x, y), where T.false(x) is an invocation of the operator false declared in T, and T.&(x, y) is an invocation of the selected operator &. In other words, x is first evaluated and operator false is invoked on the result to determine if x is definitely false. Then, if x is definitely false, the result of the operation is the value previously computed for x. Otherwise, y is evaluated, and the selected operator & is invoked on the value previously computed for x and the value computed for y to produce the result of the operation. The operation x || y is evaluated as T.true(x) ? x : T.|(x, y), where T.true(x) is an invocation of the operator true declared in T, and T.|(x, y) is an invocation of the selected operator |. In other words, x is first evaluated and operator true is invoked on the result to determine if x is definitely true. Then, if x is definitely true, the result of the operation is the value previously computed for x. Otherwise, y is evaluated, and the selected operator | is invoked on the value previously computed for x and the value computed for y to produce the result of the operation. In either of these operations, the expression given by x is only evaluated once, and the expression given by y is either not evaluated or evaluated exactly once. J.Zs.Cs.: Vizuális programozás (c) 2013

Példa: Logikai operátorok átdefiniálása J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 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) 2013

Példa Dátumkonverzió

J.Zs.Cs.: Vizuális programozás (c) 2013 public static explicit operator Datum(int napok) { Datum d=new Datum(0,0,0); if(napok<=0) throw new InvalidCastException ("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 d4=(Datum)731878; J.Zs.Cs.: Vizuális programozás (c) 2013

Kivételek és kezelésük

J.Zs.Cs.: Vizuális programozás (c) 2013 Hiba-leállás Ctrl+F5 Hibás adat Nem kezelt kivétel J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Hiba-leállás F5 Hibás Adat Nem kezelt kivétel J.Zs.Cs.: Vizuális programozás (c) 2013

Cél: hibakezelés új adatok bekérésével J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Kivételosztályok J.Zs.Cs.: Vizuális programozás (c) 2013

Milyen kivételek következhetnek be? Súgó Gyorstipp J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

Kivétel továbbadása - A finally blokk használata J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Kivételek előidézése if (perc < 1 || perc >= 60) { throw new InvalidTimeException(perc + " érvénytelen percérték"); // !! ide már nem jut el a vezérlés !! } J.Zs.Cs.: Vizuális programozás (c) 2013

Aritmetikai túlcsordulás alapértelmezés szerint nincs ellenőrizve programban utasításra checked { int szam = int.MaxValue; Console.WriteLine(++szam); // OverflowException } unchecked Console.WriteLine(++szam); //-2147483648 programban kifejezésre: (checked(++szam)) J.Zs.Cs.: Vizuális programozás (c) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 Példa Egyszerű kivételkezelés Faktoriálisszámítás kivételkezeléssel J.Zs.Cs.: Vizuális programozás (c) 2013

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) 2013

J.Zs.Cs.: Vizuális programozás (c) 2013 typeof using System; using System.Reflection; … Type típus=typeof(int); MethodInfo[ ] metódusok=típus.GetMethods(); foreach (MethodInfo mi in metódusok) Console.WriteLine(mi); Console.ReadLine(); J.Zs.Cs.: Vizuális programozás (c) 2013