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

Hasonló dokumentumok
Bánsághi Anna

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

C# Zero.4 Introducing Visual C# 2.0

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

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

Informatika terméktervezőknek

Bánsághi Anna

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

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

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

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

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

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?

Globális operátor overloading

Szoftvertechnológia alapjai Java előadások

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

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Programozási nyelvek Java

Programozási nyelvek Java

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

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

Objektumorientált programozás C# nyelven III.

Generikus Típusok, Kollekciók

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

Bevezetés a programozásba 2

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

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

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

Magas szintű programozási nyelvek 2 Előadás jegyzet

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

Adatbázisok* tulajdonságai

INFORMATIKAI ALAPISMERETEK

Programozás II. labor

Pénzügyi algoritmusok

JAVA PROGRAMOZÁS 3.ELŐADÁS

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

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

117. AA Megoldó Alfréd AA 117.

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

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

Apple Swift kurzus 3. gyakorlat

Entity Framework alapú adatbáziselérés

BME MOGI Gépészeti informatika 4.

Objektumorientált programozás C# nyelven

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

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

Objektum orientált kiterjesztés A+ programozási nyelvhez

Objektumorientált programozás C# nyelven

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

A C# programozási nyelv alapjai

JAVA PROGRAMOZÁS 2.ELŐADÁS

Java és web programozás

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

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

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Kivételkezelés, naplózás. Exception handling, logging

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

Java II. I A Java programozási nyelv alapelemei

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

OOP #14 (referencia-elv)

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

Felhasználó által definiált adattípus

Java programozási nyelv 9. rész Kivételkezelés

és az instanceof operátor

Programozási nyelvek II.: JAVA

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

Collections. Összetett adatstruktúrák

Objektumok inicializálása

Komputeralgebra Rendszerek

Java II. I A Java programozási nyelv alapelemei

Osztályok. 4. gyakorlat

C++ programozási nyelv Konstruktorok-destruktorok

Objektumorientált programozás C# nyelven III.

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

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?

Objektumorientált programozás C# nyelven

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Adatbázis-kezelés. Harmadik előadás

Smalltalk 2. Készítette: Szabó Éva

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

Programozás I. Második ZH segédlet

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

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Programozási nyelvek Java

23. Fa adatszerkezetek, piros-fekete fa adatszerkezet (forgatások, új elem felvétele, törlés)(shagreen)

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

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

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

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

Kivételek, kivételkezelés a C++ nyelvben

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

Objektumorientált programozás C# nyelven

Programozás I. Első ZH segédlet

INFORMATIKAI ALAPISMERETEK

Adattípusok. Max. 2GByte

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

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

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

Átírás:

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

C# verziók 1.0 menedzselt kód, a.net platform saját nyelve 2.0 generikusok bevezetése 3.0 LINQ 4.0 dinamikus programozás 5.0 a fordító, mint szolgáltatás

Tartalom Előző előadásban: lexikális elemek, vezérlési szerkezetek, típuskonstrukciók Következik: Kivételkezelés yield return Delegate-k Generikusok Attribútumok Unsafe mód Nullable típusok Extension methods LINQ C# 4.0: dynamic, named & optional arguments, variance

Kivételkezelés try catch finally A catch ágak sorrendje kötött! A speciálisabbtól az általánosabbig, a sorrendet a fordító ellenőrzi. Kivételek az Exception osztály leszármazottai. Nincs throws záradék, mint például Java-ban. Kivétel dobása: throw new MyException( );

Yield return yield return <expression>; vagy yield break; Lehet rekurzív is a függvény! Késleltetett kiértékelés A háttérben a fordító készít egy IEnumerator<T>-t (is) implementáló osztályt public IEnumerator<int> GetEnumerator() { for (int i = 0; i < 10; i++) { yield return i; } }

Delegate-k Típusos metódusreferenciák Hasonló, mint a C/C++-beli függvénypointerek public delegate int Calc(int x, int y); public int add(int x, int y) { return x + y; } Calc calc = new Calc(this.add); int x = calc(3, 4); A delegate is objektum, így paraméterként átadható.

Delegate-k Multicast delegate Egy delegate valójában egy időben több függvényre is mutathat. A delegate-re feliratkozó függvények a delegate invokeálásakor sorban meghívásra kerülnek. delegate void Del(string s); void leftchar(string s) { Console.WriteLine(s[0]); } void rightchar(string s) { Console.WriteLine(s[s.length-1]); } Del del = new Del(leftChar); del += rightchar; del("teszt"); // Eredmény: T\nt

Delegate-k Események (event) Ugyanúgy MulticastDelegate-k public delegate void SomeEventHandler(object o, SomeEventArgs e); public event SomeEventHandler SomeEvent; obj.someevent += new SomeEventHandler(obj_Some); void obj_some(object sender, SomeEventArgs e) { }

Generikus lehetőségek Típusbiztos, dobozolás nélküli collection-ök class Osztaly<X, Y> { X x; Y y; public X Method(Y y1, Y y2) {... } } Metódus, delegate is lehet generikus... Constraint-ek: class Osztaly<T> where T: struct class new() <base class> <interface>

Generikus lehetőségek default érték T temp = default(t); T temp = null; nem működne értéktípusoknál T temp = 0; nem működne referenciatípusoknál Hasonlít a C++-os template-khez, de nem ugyanaz! Nem adható át érték, csak típus paraméterként Kevésbé rugalmas, mint a C++-nál: nem használhatók például aritmetikai műveletek, csakis olyanok, amelyek megléte következik a megszorításokból

Attribútumok Metainformációk Hasonló, mint a Java annotációi Osztályokhoz, metódusokhoz, tagokhoz, stb. [Serializable] class Osztaly { } Attribute osztály leszármazottai, konvenció szerint Attribute-ra végződik a nevük, azonban az elhagyható.

Unsafe mód unsafe kulcsszóval megjelölhetünk blokkot, metódust, de akár osztályt is! C++ módba váltás Teljesítménykritikus helyeken Pointeraritmetika hasonló, mint C++-ban (++, --, &, void*, stb.) Veremre foglalhatunk tömböt char* charpointer = stackalloc char[123]; Veszélyes, mert nincs tömbhatárellenőrzés

Unsafe mód static unsafe void Copy(byte[] src, int srcindex, byte[] dst, int dstindex, int count) { if (src == null srcindex < 0 dst == null dstindex < 0 count < 0) { throw new System.ArgumentException(); } int srclen = src.length; int dstlen = dst.length; if (srclen - srcindex < count dstlen - dstindex < count) { throw new System.ArgumentException(); } fixed (byte* psrc = src, pdst = dst) { byte* ps = psrc; byte* pd = pdst; for (int i = 0 ; i < count / 4 ; i++) { *((int*)pd) = *((int*)ps); pd += 4; ps += 4; } } for (int i = 0; i < count % 4 ; i++) { *pd = *ps; pd++; ps++; }

Nullable típusok Például adatbázisokban int? a; a = 5; // ok a = null; // ok if (a.hasvalue) { int b = a.value; } Valójában a System.Nullable<T> osztályra épül, szintaktikus egyszerűsítés

Nullable típusok Mi történik? int? a = 5; int? b = null; a += b; //? if (a<b) { } //? Ha az egyik operandus null, a végeredmény null! Illetve logikai kifejezésnél false. bool?-ok között & és műveletek a háromértékű logikának megfelelően, az SQL-lel kompatibilis módon

Nullable típusok bool? operator &(bool? x, bool? y) bool? operator (bool? x, bool? y) x y x&y x y true true true true true false false true true null null true false true false true false false false false false null false null null true null true null false false null null null null null

Nullable típusok?? null coalescing operator Feltételes operátorral is megoldható (?:), de így egyszerűbb string str1 = "..."; string str2 = str1?? "null!"; // str2 == "..." string str1 = null; string str2 = str1?? "null!"; // str2 == "null!"

Extension methods Látszólag osztályok működésének kibővítésére. Gyakorlatilag syntax sugar. Vigyázni kell velük, mert könnyen ellepnek (legalábbis az IntelliSense listát biztosan) namespace ExtensionMethods { public static class MyExtensions { public static int WordCount(this String str) { return str.split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } }... int i = "Hello Extension Methods".WordCount();

Extension methods Statikus osztályba statikus függvényként, első paraméter: this <osztály> <név> Rengeteg megvalósított extension method: System.Linq névtérbeli Enumerable és Queryable osztályokban (Average, Sum, Take, Where, Union, stb.)

Még néhány 3.0-s apróság Tömörebb kód Auto a = new Auto(); a.rendszam = "XXX-001"; // helyett Auto a = new Auto{ Rendszam = "XXX-001" }; List list = new List(); list.add(0); list.add(1); // helyett List list = new List{ 0, 1 } public string Name{ get; private set; } List<List<KeyValuePair<string, int>>> list = new List<List<KeyValuePair<string, int>>>(); // helyett var list = new List<List<KeyValuePair<string, int>>>(); delegate int del(int i); del d = delegate(int x) { return x * x; }; // helyett del d = x => x * x;

LINQ Language Integrated Query Tömör, SQL-szerű forma felsorolható adatszerkezetekkel való műveletvégzésekhez List<int> numbers = new List<int>() { 5, 4, 1, 3, 7, 2, 0 }; IEnumerable<int> orderingquery = from num in numbers where num < 3 num > 7 orderby num ascending select num; string[] groupingquery = { "carrots", "cabbage", "broccoli", "beans", "barley" }; IEnumerable<IGrouping<char, string>> queryfoodgroups = from item in groupingquery group item by item[0];

LINQ Bármilyen, IEnumerable<T>-t megvalósító adatokon Lehet az adatbázistábla, tömb, láncolt lista Syntax sugar: string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; IEnumerable query = from n in names where n.contains("a") orderby n.length select n.toupper(); IEnumerable query = names.where<string>(delegate (string n) { return n.contains("a"); }).OrderBy<string, int>(delegate (string n) { return n.length; }).Select<string, string>(delegate (string n) { return n.toupper(); }); IEnumerable query = names.where(n => n.contains("a")).orderby(n => n.length).select(n => n.toupper());

C# 4.0 Paramétereknek alapértelmezett érték (lásd C++) public void M(int x, int y = 5, int z = 7); M(1, 2, 3); // normál hívás M(1, 2); // M(1, 2, 7) M(1); // M(1, 5, 7) Mi legyen ha x-et és z-t szeretnénk csak beállítani? M(1,,3) alakban nem hívható Név szerinti paraméter-megfeleltetés Volt ilyen lehetőség Ada-ban is M(1, z: 3); // M(x: 1, z: 3) M(z: 3, x: 1)

C# 4.0 Kovariancia és kontravariancia generikusoknál

C# 4.0 Parallel Extensions Nem nyelvi elemek (még) Parallel LINQ PLINQ Task Parallel Library TLP IEnumerable<T> data =...; var q = data.where(x => p(x)).orderby(x => k(x)).select(x => f(x)); foreach (var e in q) a(e); // helyett, AsParallel<T>() metódus IParallelEnumerable<T>-rel tér vissza IEnumerable<T> data =...; var q = data.asparallel().where(x => p(x)).orderby(x => k(x)).select(x => f(x)); foreach (var e in q) a(e);

C# 4.0 Parallel.For, Parallel.Foreach A lambda-kifejezéseknek köszönhetően szintaktikailag hasonló formában, mint az eredeti for, foreach for (int row=0; row < pixeldata.getupperbound(0); ++row) { for (int col=0; col < pixeldata.getupperbound(1); ++col) { pixeldata[row, col] = AdjustContrast(pixelData[row, col], minpixel, maxpixel); } } Parallel.For(0, pixeldata.getupperbound(0), row => { for (int col=0; col < pixeldata.getupperbound(1); ++col) { pixeldata[row, col] = AdjustContrast(pixelData[row, col], minpixel, maxpixel); } });

C# 4.0 Dinamikus programozás támogatása (CLR + DLR) Nagyobb rugalmasság futási időben több hibalehetőség dynamic d = GetDynamicObject( ); d.m(7); d statikus típusa dynamic! Új.Net-es nyelvek: IronPython, IronRuby

C# 5.0 Még csak concept Fordító, mint szolgáltatás Metaprogramozás, programmal generálunk programot, ami CSharpEvaluator ce = new CSharpEvaluator(); ce.usings.add("system"); ce.eval("for (int i=0; i<10; ++i) Console.WriteLine(i*i);");

Köszönöm a figyelmet!