C# Zero.4 Introducing Visual C# 2.0

Hasonló dokumentumok
Generikus Típusok, Kollekciók

Objektumorientált programozás C# nyelven

C# osztályok. Krizsán Zoltán

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

OOP #14 (referencia-elv)

Osztályok. 4. gyakorlat

Programozási Paradigmák. és Technikák

Láncolt lista Bináris keresőfa Gráf Hasító táblázat. Programozás II. labor 2. rész (Adatszerkezetek)

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Programozási nyelvek Java

Objektumorientált programozás C# nyelven

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

Programozási nyelvek II.: JAVA

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

Collections. Összetett adatstruktúrák

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

Programozási technológia

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

C++ programozási nyelv

Programozás II. labor

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

és az instanceof operátor

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

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

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

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

Java és web programozás

Programozási alapismeretek 4.

Objektumorientált programozás C# nyelven

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

C# versus Java. Óbudai Egyetem, Java Standard Edition Mérnök Informatikus szak, BSc Labor 3. Bedők Dávid v0.4

C#, OOP. Osztályok tervezése C#-ban

Interfészek. PPT 2007/2008 tavasz.

Programozási Paradigmák és Technikák

Programozási nyelvek Java

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Web-technológia PHP-vel

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

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

OOP: Java 8.Gy: Abstract osztályok, interfészek

Bánsághi Anna

Bánsághi Anna

C++ programozási nyelv Konstruktorok-destruktorok

Objektumorientált programozás C# nyelven

Delegátumok C#-ban Krizsán Zoltán iit

Java és web programozás

Java és web programozás

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

Java programozási nyelv 5. rész Osztályok III.

C# Zero.4 Overview of.net and introducing Visual C# 1.2

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

BME MOGI Gépészeti informatika 8.

Programozási nyelvek Java

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Események C#-ban Krizsán Zoltán iit

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

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Már megismert fogalmak áttekintése

Programozási nyelvek Java

Objektumok inicializálása

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Programozás II. 4. Dr. Iványi Péter

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

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

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

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

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

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

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

Java és web programozás

Szoftvertechnolo gia gyakorlat

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

Öröklés és Polimorfizmus

Java és web programozás

Programozási nyelvek Java

Programozási nyelvek II.: JAVA, 11. gyakorlat

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

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

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

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

Access adatbázis elérése OLE DB-n keresztül

A C# nyelv újdonságai és jövője. Neuwirth István, 2010

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

Bevezetés a programozásba 2

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

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

Programozási Paradigmák és Technikák

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

Objektumorientált Programozás VI.

Vizuális, eseményvezérelt programozás XI.

Objektumorientált programozás C# nyelven

Programozás módszertan

BME MOGI Gépészeti informatika 7.

Átírás:

Session Code: N/A C# Zero.4 Introducing Visual C# 2.0 Fülöp Dávid MCT, MCPD david.fulop@live.com

Témák Mik a problémák a nyelvvel? Hol segít a C# 2.0? Fejlesztett tulajdonságok Statikus és részleges osztályok Generics A delegáltak és a metódusok továbbfejlesztése Anonim metódusok Nullable típusok

PROBLÉMÁK A NYELVVEL

Problémák a C# 1.2-vel Hol nem tud eleget a C# 1.2? Típusbiztos gyűjtemények hiánya A delegate variance hiánya Az értéktípusok nullozhatatlansága A delegáltak... Nos, suták. Az iterátorok nehézkes megírása Hol akadályozhat a munkában a típusrendszer? Statikus nyelvben nincs duck typing

A C# 2.0 ÁTTEKINTÉSE

A C# 2.0 nyelv elhelyezése A C#2 típusrendszere (nem változott) statikus A rendszer mindig pontosan tudja, hogy milyen tagokat használhatunk. explicit Mindig pontosan meg kell adnunk egy tag típusát. Típusbiztos Egy változót nem használhatunk más típusúként hacsak nincs köztük konverziós operátor.

A tulajdonságok fejlődése C#1-ben a get/set örökli a prop. láthatóságát Ha csak olvasható propertyt szeretnénk, törölni kell a setet, ez problémás lehet C#2-ben a get/set accessorok saját láthatóságot kaphatnak A protected set megoldja az öröklésnél felmerült problémákat public int Age { get { return age; } protected set { age = value; } }

Statikus osztályok Egységesül a utility class pattern Sokszor készítettünk segédosztályokat: Az összes tag statikus Az osztály az Objectből származik, sokszor lezárt Legtöbbször nem tárol állapotot Nincs látható konstruktor Alkalmazzuk a static kulcsszót az egész osztályra! Implicit abstract és sealed lesz Nincs őse (de: System.Object), nem valósít meg interfészt Nem tartalmazhat nem-statikus tagokat, operátorokat, protected (internal) láthatóságú tagokat

Részleges osztályok A partial kulcsszó vezeti be Lehet abstract vagy sealed Egy osztály kódja több fájlra oszlik Segíti a kód olvashatóságát A VS designeréhez szükséges kódgenerátorok Az osztály magját legenerálja a VS, a többit mi írhatjuk meg, anélkül, hogy a generált részbe bele kellene nyúlni Fordításkor a compiler egyetlen típust gyárt le a több fájlból

Mi a probléma? class Alma { public bool CreatedByGonoszMostoha; } class AlmaList { private Alma[] items = new Alma[5]; public void Add(Alma item) { //... } public void Remove(Alma item) { //... } public Alma this[int i] { //nem kivételkezelünk... get { return items[i]; } set { items[i] = value; } } }

Mi a probléma? ArrayList aaamáák = new ArrayList(); aaamáák.add(new Alma()); Console.WriteLine(aaamáák[0].GetType()); Console.WriteLine(aaamáák[0].CreatedByGonoszMostoha); Console.WriteLine(((Alma)aaamáák[0]).CreatedByGonoszMostoha);

Típusbizonytalanság Mit tehetünk, ha egy tömbünknek egyszerre kell dinamikusnak és típusbiztosnak lennie? C#1.2: Gyárcsá magadnak! Miért kell egy interfészmetódusnak objectet visszaadnia vagy paraméterként fogadnia? C#1.2: Írjunk meg minden interfészt minden típusra? ROTFLMAO!

Generikus típusok Más néven sablonok, template-ek Olyan osztályok, metódusok, melyek legalább egy típusparaméterrel rendelkeznek Miért előnyös genericset használni? Nagyobb flexibilitás Nagyobb (típus)biztonság Jobb teljesítmény Generikus metódus nem csak generikus osztályban lehet Egy generikus osztály nem kell, hogy generikus metódusokat tartalmazzon

.NET 1-es típus ArrayList Queue, Stack Generikus gyűjtemények HashTable, ListDictionary, HybridDictionary, OrderedDictionary, NameValueCollection SortedList SortedDictionary DictionaryEntry Megfelelő generikus típus List<> Queue<>, Stack<> Dictionary<> SortedList<> SortedDictionary<> NameValuePair<> - LinkedList<>

Generikus és normál gyűjtemények Jon Skeet: C# in Depth

Saját generikus típusok A név után < és > közé jönnek a típusparaméterek Osztály, interfész, struktúra, metódus public class MyGenList<T> { ArrayList al = new ArrayList(); public void Add(T val) { al.add(val); } public TRet GetAs<TRet>(int index) { return al[index] as TRet; }... }

Default érték, megkötések A default kulcsszó Nem tudható, hogy érték vagy referencia típusú-e a paraméter Megoldás: this.elem = default(t); Referenciánál nullt ad vissza, érték típusnál bitenkénti nullát Megkötések A típusparaméterek elvárt viselkedését írják le Alapban annyit tudunk, hogy a típus a System.Objectből származik Típusnál és metódusnál is használhatók A where kulcsszóval vezetjük be A megkötések fajtái Leszármazott Interfész Érték típus Referencia típus (where T : class) Konstruktor (where T : new()) (where T : Személy) (where T : IEnumerable<T>) (where T : struct)

A megkötések megkötései Nem lehetnek a megkötésben Lezárt osztályok Primitív típusok System.Array System.Delegate System.Enum System.ValueType

Megkötések használata class MyClass<T> where T : IEnumerable<T> { public void Iterate(T data) { foreach (object item in data) Console.WriteLine(item); } } class MyClass2<T> where T : new() { T obj = new T();... }

FELADAT

Önálló feladat Saját generikus metódus Készíts egy egyszerű típust Legyen egy duplán paraméterezett metódusa Metódusparaméterek: T*+ list, U comparer A comparer a C#1-ben látott IComparert valósítsa meg A metódus a comparer objektummal rendezze a tömböt, és adja vissza rendezetten. A kapott tömbhöz ne nyúljon! A metódus csak Celeb (és abból leszármazó) tömböket fogadjon el. Használd ki a generikus megkötéseket!

Type inference, generikus variancia Type inference Ha egy metódusparaméterből egyértelmű, hogy milyen típusparaméterrel szeretnénk dolgozni, a fordító kitalálja helyettünk, nem kell explicit módon beírnunk. Paramétertípus-variancia Nincs. (Pont.) Animal[] animals = new Cat[5]; animals[0] = new Animal(); //lefordul, elszáll List<Animal> animals = new List<Cat>(); //elszáll animals.add(new Animal());

Értéktípusok nullértéke C# 1.2-ben Nem lehetséges; a megoldási minták: Magic value Referenciatípusú csomagolóosztály Egy extra bool flag Egyik sem szép, de cserébe legalább rontják a kódot

Nullable típusok Értéktípusok, melyek értéke null is lehet A használat két módja.net: Nullable<értéktípus> Pl.: Nullable<int> i = null; Csak C#: Értéktípus? Pl.: int? i = null; Tulajdonképpen referenciatípusok Nem egyértelmű a Nullable<típus> -> típus átalakítás, kasztolni kell Némileg lassítják a kódot!

A null-coalescing operátor?? (nem, nem felejtettem el a szöveget ) Bináris operátor Ha a baloldal nem null, az lesz a kifejezés értéke, ha null, a jobb oldal lesz. Address contact = user.contactaddress?? order.shippingaddress?? user.billingaddress;

Delegáltak a C# 1.2-ben Megoldandó problémák A szintaxis sokszor feleslegesen bőbeszédű Nincs visszatérésitípus-kovariancia Nincs paramétertípus-kontravariancia

Delegáltak a C# 2.0-ban I. Metóduscsoport-konverzió Egy metódusnév automatikusan delegálttá alakul, ha szükség van rá. Rövidül a kód Ha paraméter, szükség lehet explicit kasztolásra void MyMethod() void MyMethod(object sender, EventArgs e) ThreadStart x = MyMethod; EventHandler y = MyMethod;

Delegáltak a C# 2.0-ban II. Eltűnik a szigorú szignatúra-megkötés Paraméter-kontravariancia Egy paraméter típusának megfeleltethető a típus egy őstípusa is. Visszatérési érték-kovariancia A visszatérési érték típusának megfeleltethető a típus egy leszármazottja is.

Delegáltak a C# 2.0-ban III. Megjelennek a névtelen metódusok A delegate kulcsszóval nyithatók Inline, a használat helyén írjuk meg őket Előnye, hogy elérhetők a helyi változók A paraméterek elhagyhatók button1.click += delegate(object o, EventArgs e) { MessageBox.Show(o.ToString()); }; delegate void Printer(string s); string s = "Hello "; Printer p = delegate(string j) { Console.WriteLine(s + j); }; p("world!"); //Itt adjuk át a j paramétert

FELADAT

Önálló feladat Névtelen metódus Folytasd az előző feladatot Írj egy olyan overloadot a metódusnak, amely IComparer helyett egy metódust fogad, és ennek segítségével rendezi a tömböt. Teszteld a metódust egy névtelen metódus átadásával.

Iterátorok a C# 1.2-ben A foreach-csel való használathoz szükséges A megoldásuk sok kódolást igényel Beágyazott osztály a listánkban, hogy hozzáférjünk a lista belső változóihoz Megvalósítani rajta az IEnumerator interfészt Gondoskodni az állapotinformáció tárolásáról Ez sok kód, tele hibalehetőségekkel A kód logikája legtöbbször ugyanaz sokszor írjuk le ugyanazt

Iterátorok a C# 2.0-ban Megjelenik a yield kulcsszó A megoldás akár egy sorba is belesűríthető Elég az enumerálandó osztály GetEnumerator metódusában megírni a kódot

Amit az iterátorokról tudni érdemes Ha iterálás közben változik a lista, az hiba Érdemes snapshot -ot készíteni a tömbről Érdemes rögtön readonly-vá is tenni Ezzel szálbiztossá is tehetjük az enumerátort Statikus gyűjteményeknél erre nincs szükség

Példafeladat AZ ÁLLATORVOSI LÓ 2.0

Az állatorvosi ló megnevelése Az eddig tanultak alapján, a C# 2.0 eszközeivel készítsük el a Ló osztályt, mely rendelkezik egy névvel, egy születési idővel, egy árral és egy listával az állat eddig begyűjtött díjairól. Legyen továbbá egy eseménye (Versenyez), melyre más objektumok feliratkozhatnak. készítsük el az erre feliratkozó Függő osztályt. készítsünk egy listát a lovakból, és jelenítsük meg őket ábécérendben, valamint listázzuk ki a 10000 kreditnél drágább lovakat. gondoljuk meg, hogyan tudjuk a még ár nélküli lovakat kezelni.

RECAP

Összefoglalás A generics kiegészítette a nyelvet azokkal a részekkel, amelyek kardinálisak a könnyű fejlesztéshez Megoldott az értéktípusok nullozhatósága is A delegáltak fejlesztései egyszerűbb programozást tesznek lehetővé A névtelen metódusokkal kevesebb kóddal, átláthatóbban oldhatunk meg feladatokat Egyéb apróbb fejlesztések is történtek Nagyobb tudású tulajdonságok, statikus és részleges osztályok...

Q & A

C# Zero.4 Introducing Visual C# 2.0 KÖSZÖNÖM A FIGYELMET!