Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Néhány fontosabb nyelvi elem
Ismétlés Néhány fontosabb nyelvi elem
2
Tulajdonságok
3
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
4
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
5
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
6
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
7
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
8
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
9
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
10
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
11
Automatikus tulajdonság (automatikusan implementált)
J.Zs.Cs.: Vizuális programozás (c) 2013
12
Példaprogram Jelszóbekérő ablak
13
Indexelők
14
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
15
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
16
Példaprogram Asszociatív
17
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 J.Zs.Cs.: Vizuális programozás (c) 2013
18
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
19
J.Zs.Cs.: Vizuális programozás (c) 2013
Használat J.Zs.Cs.: Vizuális programozás (c) 2013
20
Virtual példa J.Zs.Cs.: Vizuális programozás (c) 2010
21
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
22
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
23
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
24
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
25
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
26
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
27
Objektum inicializálás
J.Zs.Cs.: Vizuális programozás (c) 2013
28
Metódusreferencia és eseménykezelés
29
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
30
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
31
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
32
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
33
Metódusreferencia példaalkalmazás
J.Zs.Cs.: Vizuális programozás (c) 2013
34
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
35
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
36
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
37
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
38
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
39
Röviden a .Net platformról
40
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
41
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
42
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]
43
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 ( DotGnu ( 0.1 J.Zs.Cs.: Vizuális programozás (c) 2013
44
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
45
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]
46
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]
47
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]
48
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 MonoDevelop 2.2 J.Zs.Cs.: Vizuális programozás (c) 2013
49
J.Zs.Cs.: Vizuális programozás (c) 2013
SharpDevelop J.Zs.Cs.: Vizuális programozás (c) 2013
50
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
51
J.Zs.Cs.: Vizuális programozás (c) 2013
.Net Reflector Lutz Roeder J.Zs.Cs.: Vizuális programozás (c) 2013
52
J.Zs.Cs.: Vizuális programozás (c) 2013
[1] Albert István: Többrétegű architektúrák .NET platformon J.Zs.Cs.: Vizuális programozás (c) 2013
53
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
54
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
55
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
56
Ismétlés Önálló munka
57
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
58
J.Zs.Cs.: Vizuális programozás (c) 2013
Típusok osztályozása J.Zs.Cs.: Vizuális programozás (c) 2013
59
Value types and reference types in the CTS
J.Zs.Cs.: Vizuális programozás (c) 2013
60
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
61
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
62
XML dokumentáció generálása
VS Enterprise Architect J.Zs.Cs.: Vizuális programozás (c) 2013
63
Konzol IO - Formázott megjelenítés
Console.WriteLine( "{0,-5:X}__{1,10:F3}", 100,-555.8); Eredmény: 64 __ J.Zs.Cs.: Vizuális programozás (c) 2013
64
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
65
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
66
J.Zs.Cs.: Vizuális programozás (c) 2013
Foglalt változónév J.Zs.Cs.: Vizuális programozás (c) 2013
67
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
68
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
69
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
70
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
71
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
72
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
73
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
74
Tömbpélda
75
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
76
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
77
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
78
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
79
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
80
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
81
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
82
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
83
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
84
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
85
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
86
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
87
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
88
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
89
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
90
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
91
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
92
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
93
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
94
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
95
Structpélda
96
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
97
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
98
Feladat szöveg (16 bit/karakter) tárolása BitArray-ként majd visszaállítás önálló tanulmányozásra
99
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
100
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
101
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
102
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
103
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
104
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
105
Á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
106
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
107
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
108
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
109
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
110
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
111
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
112
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
113
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
114
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
115
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
116
J.Zs.Cs.: Vizuális programozás (c) 2013
[XAttribute("Géza", Dátum=" ")] public class OsztNév { … } J.Zs.Cs.: Vizuális programozás (c) 2013
117
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
118
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
119
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
120
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
121
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
122
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
123
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
124
Sealed módosító beállítása
J.Zs.Cs.: Vizuális programozás (c) 2013
125
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
126
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
127
J.Zs.Cs.: Vizuális programozás (c) 2013
Öröklődés példa J.Zs.Cs.: Vizuális programozás (c) 2013
128
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
129
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
130
Példa az operátor átdefiniálásra
DatumKezelo J.Zs.Cs.: Vizuális programozás (c) 2013
131
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 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
132
Példa: Logikai operátorok átdefiniálása
J.Zs.Cs.: Vizuális programozás (c) 2013
133
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
134
Példa Dátumkonverzió
135
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
136
Kivételek és kezelésük
137
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
138
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
139
Cél: hibakezelés új adatok bekérésével
J.Zs.Cs.: Vizuális programozás (c) 2013
140
J.Zs.Cs.: Vizuális programozás (c) 2013
Kivételosztályok J.Zs.Cs.: Vizuális programozás (c) 2013
141
Milyen kivételek következhetnek be?
Súgó Gyorstipp J.Zs.Cs.: Vizuális programozás (c) 2013
142
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
143
Kivétel továbbadása - A finally blokk használata
J.Zs.Cs.: Vizuális programozás (c) 2013
144
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
145
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); // programban kifejezésre: (checked(++szam)) J.Zs.Cs.: Vizuális programozás (c) 2013
146
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
147
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
148
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
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.