Programovací jazyk C# Verze jazyka 3.0

Podobné dokumenty
Programovací jazyk. Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018 /

Programovací jazyk C# Verze jazyka 3.0

Functional and Logic Programming Functional languages

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Nové prvky v C# 3.0. David Keprt

Jazyk C# (seminář 6)

Funkcionální programování

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Komponenty v.net. Obsah přednášky

Reaktivní programování v.net

PŘETĚŽOVÁNÍ OPERÁTORŮ

Funkcionální programování. Kristýna Kaslová

Generické programování

Úvod do programovacích jazyků (Java)

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Úvod do programovacích jazyků (Java)

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Abstraktní datové typy: zásobník

PREPROCESOR POKRAČOVÁNÍ

Novinky ve Visual Studio Tomáš Kroupa

Zápis programu v jazyce C#

Návrh softwarových systém. Návrh softwarových systémů

Ukládání a vyhledávání XML dat

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Jazyk C# - přístup k datům

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Denotační sémantika. Marek Běhálek

Jazyk C# - přístup k datům

typová konverze typová inference

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

IRAE 07/08 Přednáška č. 1

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Úvod do databázových systémů

6 LINQ Strana LINQ Václav Pachta

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Programování II. Modularita 2017/18

UJO Framework. revoluční architektura beans. verze

1. Programování proti rozhraní

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Maturitní otázky z předmětu PROGRAMOVÁNÍ

LINQ. (Language integrated query) Prezentace na 3IT353. Zpracovali: Martin Latiak, Michal Pěnka, Petr Spurný

Dědičnost (inheritance)

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

boolean hasnext() Object next() void remove() Kolekce

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Dotazování nad stromem abstraktní syntaxe

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Jakub Čermák Microsoft Student Partner

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

KTE / ZPE Informační technologie

8 Třídy, objekty, metody, předávání argumentů metod

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Jazyk C# (seminář 3)

Úvod do databázových systémů

Objektově orientované programování

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

PB161 Programování v jazyce C++ Přednáška 10

PB161 Základy OOP. Tomáš Brukner

Teoretické minimum z PJV

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programovací jazyk Haskell

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Úvod do programování - Java. Cvičení č.4

Jazyk C# a platforma.net

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Seminář Java IV p.1/38

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Programovací í jazyk Haskell

Výčtový typ strana 67

Jazyk C++ I. Šablony 2

JAVA. Další jazyky kompilovatelné do Java byte-code

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Algoritmizace a programování

Dědění, polymorfismus

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

PB161 Programování v jazyce C++ Přednáška 9

DTP Základy programování Úvod do předmětu

Michal Krátký, Miroslav Beneš

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Kolekce, cyklus foreach

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Více o konstruktorech a destruktorech

Transkript:

Programovací jazyk C# Verze jazyka 3.0 Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz V přednášce jsou použity části prezentace stažené z: http://mff.netstudent.cz, autor: Tomáš Petříček Náplň kapitoly Základní informace o LINQu Stručný úvod do funkcionálního programování Nové vlastnosti jazyka Lambda Výrazy Extension metody Dedukce typu lokání proměnné Inicializárory objektů Anonymní typy Dotazovací výrazy Výrazové stromy 2 Nové vlastnosti jazyka C# V této kapitole budete seznámeni s rozšířeními jazyka Koncepce LINQ projektu Dominantní technologií je OOP Jsou už používané více než 20 let Stále existují neobjektové zdroje dat a informací Relační databáze, XML data,... V současné době velmi nepohodlná integrace Přibyly ale i jiné vlastnosti na úrovni programovacího jazyka Přejata řada prostředků z funkcionálních jazyků Umožňuje jiný styl programování. Ad hoc přístup při přidávání pro zajištění zamýšlené funkcionality. Tradiční přístup k práci s daty using(sqlconnection conn = new SqlConnection ("server=localhost;database=mojedatabaze;uid=sa;pwd="); conn.open(); SqlCommand cmd =new SqlCommand(@ SELECT * FROM [users] WHERE login=@login AND passwrd=@pass,conn); cmd.parameters.add("@login",sqldbtype.varchar); cmd.parameters.add("@heslo",sqldbtype.varchar); cmd.parameters["@login"].value = login; cmd.parameters["@pass"].value = heslo; // cmd.executereader() 3 4 1

Základní vlastnosti LINQ LINQ - Language integrated query Cíle projektu LINQ Typová kontrola při překladu Eliminace běhových chyb Jednodušší zápis, který je součástí jazyka Není nutné učit se další jazyk Větší bezpečnost Odpadají problémy s SQL injection Rozšíření.NET jazyků pro práci s neobjektovými daty Rozšíření jazyka Základem jsou dotazovací operátory filtrování, projekce, seskupování, atd.. - lze používat na libovolné.net kolekce Rozšiřitelnost LINQ dotazů Pro vlastní objekty lze operátory reimplementovat Technicky je LINQ projekt postavený na.net 2.0 (plná zpětná kompatibilita) LINQ over Ienumerable<T> C# VB.Net Další Objekty LINQ over DataSets LINQ to SQL LINQ to XML Další... SQL <book> <title/> <author/> <year/> <price/> </book> XML 5 6 Funkcionální jazyky Jazyk a architektura počítače Funkcionální jazyky Rozdíly mezí imperativními a deklarativními jazyky Omezení jazyku na to, co lze efektivně implementovat na současných procesorech. Von Neumannova architektura Model klasických procesorů Základ klasických jazyků Funkcionální jazyky Backus (1978, Turing Adward) kritika přístupu od architektury k jazyku Funkcionální jazyky jsou efektivnější než imperativní Lze dokazovat vlastnosti programů Jednoduše je lze paralelizovat Založeno na algebraických pravidlech Malá efektivita implementace možné optimalizace Imperativní jazyky Program má implicitní stav, který se modifikuje konstrukcemi programovacího jazyka. Explicitní pojem pořadí příkazů Vyjadřuje, jak se má program vyhodnocovat Vychází z aktuální (Von Neummanovy) architektury počítačů Jednoduchá a efektivní realizace Deklarativní jazyky Program nemá implicitní stav. Program je tvořen výrazy, ne příkazy. Popisujeme co se má spočítat, ne jak. Není dáno pořadí příkazu. Program je vyhodnocen redukčním systémem Funkcionální jazyky x Relační (logické) jazyky 7 8 2

Funkcionální jazyky Funkcionální programovací jazyky (2) Funkcionální jazyky - λ-kalkul Umožňují nové algebraické přístupy Lazy evaluation ( x eager evaluation) Možnost používat potencionálně nekonečné struktury. Možnost oddělení dat od řízení nemusíme se starat o to, jak proběhne vyhodnocení. Umožňuje nové přístupy k vývoji programů Možnost dokazovat programy Možnost transformovat program na základě algebraických vlastností Umožňuje lepší využití paralelního provádění programů Jednoduchá dekompozice programů na části, které lze vyhodnocovat paralelně. Potencionálně příliš mnoho paralelismů. Možnost kompozice dvou paralelních úloh jednoduchou kompozicí funkcí. 9 1930 Alonzo Church netypovaný λ-kalkul matematická teorie funkcí Proměnné x, y, z, f, g, λ-abstrakce (λx. e) Aplikace (e 1 e 2 ) Konvence pro závorky λx. λy. e 1 e 2 = (λx. (λy. e 1 e 2 )) e 1 e 2 e 3 = ((e 1 e 2 ) e 3 ) 10 Funkcionální jazyky Příklady Vytvoření seznamu druhých mocnin dm [] = [] dm (x:xs) = sq x : dm xs where sq x = x * x Seřazení seznamu (quicksort) qs [] = [] qs (x:xs) = let ls = filter (< x) xs rs = filter (>=x) xs in qs ls ++ [x] ++ qs rs Přehled novinek v Lambda Výrazy Extension metody Dedukce typu lokání proměnné Inicializárory objektů Anonymní typy Dotazovací výrazy Výrazové stromy c => c.name static void Dump(this object o); var x = 5; new Point x = 1, y = 2 new c.name, c.phone from where select 11 Expression<T> 12 3

Lambda výrazy Zobecněná syntaxe funkce x. x + 1 v je x => x + 1 Vycházejí z anonymních delegátů delegate(int x) return x + 1; Rozšiřují delegáty z.net Kromě možnosti předat lambda výraz jako delegát je možné předat lambda výraz jako expression tree. Jednoduchý způsob jak psát funkce, které lze předávat jako argumenty k vyhodnocení. 13 Lambda výrazy public delegate bool Predicate<T>(T obj); public class List<T> Příkazy Explicitně public List<T> FindAll(Predicate<T> test) typový List<Customer> customers = GetCustomerList(); List<Customer> x = customers.findall( delegate(customer c) return c.state == "WA"; ); List<Customer> x = customers.findall(c => c.state == "WA"); Implicitně typový seznam Lambda parametrů (využívá inferenci typu) Lamda výraz 14 Lambda výrazy Čím se liší lambda výraz a delegát? Func<Customer, bool> test = c => c.state == "WA"; double factor = 2.0; Func<double, double> f = x => x * factor; Func<int, int, int> f = (x, y) => x * y; Func<int, int, int> comparer = (int x, int y) => if (x > y) return 1; if (x < y) return -1; return 0; ; Lambda výraz lze přeložit Jednak do podoby kódu (jako delegát) Jednak do podoby dat Výrazový strom (Expression Tree) Na data lze aplikovat za běhu optimalizaci, překlad do jiného jazyka, Díky výrazovým stromům může LINQ to SQL překládat dotazy na SQL výrazy 15 4

Expression trees 17 public class Northwind: DataContext public Table<Customer> Customers; public Table<Order> Orders; Jak se to však spustí? Northwind db = new Northwind( ); var query = from c in db.customers where c.state == "WA" select c; Northwind db = new Northwind( ); Metoda potřebuje var query = db.customers.where(c => c.state == "WA"); výrazový strom public class Table<T>: IEnumerable<T> public Table<T> Where(Expression<Func<T, bool>> predicate); System.Expressions. Expression<T> Kompilace lambda výrazu Z lambda výrazu lze získat kód Func<Customer, bool> test = c => c.state == "WA"; Nebo výrazový strom (data) Expression<Func<Customer, bool>> test = c => c.state == "WA"; ParameterExpression c = Expression.Parameter(typeof(Customer), "c"); Expression expr = Expression.EQ( Expression.Property(c, typeof(customer).getproperty("state")), Expression.Constant("WA") ); Expression<Func<Customer, bool>> test = Expression.Lambda<Func<Customer, bool>>(expr, c); 18 Query expressions Dotazy se překládají do volání metod Where, Select, SelectMany, OrderBy, GroupBy from c in customers where c.state == "WA" select new c.name, c.phone ; customers.where(c => c.state == "WA").Select(c => new c.name, c.phone ); Query expressions Převod výrazu na volání jednotlivých metod je vždy syntakticky korektní Nemusí však být sémanticky Neexistující metody, chybné typy parametrů, nefunguje inference typů (generické metody) Pozná se to při překladu! 5

Extension methods Extenzní metody umožňují rozšířit veřejné rozhraní typů V současné době pouze o metody Technická realizace Jsou definovány jako statické typy V metadatech označeny atributem [System.Runtime.CompilerServices.Extension] První parametr je deklarován modifikátorem this V případě LINQu se přídávají operátory Ke všem objektům implementujícím IEnumerable<T> (metody Select, Where, atd...) Extension metody Extension namespace System.Query metody public static class Sequence public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) public static IEnumerable<S> Select<T, S>(this IEnumerable<T> source, Func<T, S> selector) obj.foo(x, y) Přinese extensions do XXX.Foo(obj, x, y) using System.Query; rozsahu IEnumerable<string> contacts = customers.where(c => c.state == "WA").Select(c => c.name); 21 IntelliSense! 22 Extension methods public static class Extensions public static int ToInt32(this string s) return Int32.Parse(s); public static T[] Slice<T>(this T[] source, int index, int count) if (index < 0 count < 0 source.length index < count) throw new ArgumentException(); T[] result = new T[count]; Array.Copy(source, index, result, 0, count); return result; Extension methods using N1; namespace N1 public static class E public static void F(this object obj, int i) public static void F(this object obj, string s) class A class B public void F(int i) class C public void F(object obj) 23 24 6

Extension methods static void Main(string[] args) A a=new A(); B b=new B(); C c=new C(); a.f(1); a.f("hello"); b.f(1); b.f("hello"); c.f(1); c.f("hello"); Console.ReadLine(); Výstup: E F 1 E F hello B F 1 E F hello C F 1 C F hello Object initialization expressions public class Point private int x, y; public int X get return x; set x = value; public int Y get return y; set y = value; Point a = new Point X = 0, Y = 1 ; Point a = new Point(); a.x = 0; a.y = 1; Přiřazení položky nebo vlastnosti 25 26 Object initialization expressions public class Rectangle private Point p1 = new Point(); private Point p2 = new Point(); public Point P1 get return p1; public Point P2 get return p2; Rectangle r = new Rectangle P1 = X = 0, Y = 1, P2 = X = 2, Y = 3 ; Vložené objekty Read-only vlastnosti Ne new Point Collection initialization Musí implementovat ICollection<T> List<int> powers = new List<int> 1, 10, 100, 1000, 10000 ; List<int> powers = new List<int>(); powers.add(1); powers.add(10); powers.add(100); powers.add(1000); powers.add(10000); Rectangle r = new Rectangle(); r.p1.x = 0; r.p1.y = 1; r.p2.x = 2; r.p2.y = 3; 27 28 7

Anonymní typy & klíčové slovo var Co když v projekci potřebuju vracet složený typ? Potřeba snadno vytvářet typy s danými vlastnostmi Nepotřebujeme ale znát jméno typu... Anonymní typy POZOR, neplést s typem object a dynamickým voláním Typ je známý, má známé vlastnosti, pouze nemá jméno Klíčové slovo var Typ výrazu bude odvozený z kontextu Type inference pomocí var int i = 5; string s = "Hello"; double d = 1.0; int[] numbers = new int[] 1, 2, 3; Dictionary<int,Order> orders = new Dictionary<int,Order>(); var i = 5; var s = "Hello"; var d = 1.0; var numbers = new int[] 1, 2, 3; var orders = new Dictionary<int,Order>(); var znamená stejný typ jako inicializátor 29 30 Anonymní typy public class Customer public string Name; public Address Address; public string Phone; public List<Order> Orders; public class Contact class??? public string Name; public string Phone; Customer c = GetCustomer( ); Contact x = new Contact Name = c.name, Phone = c.phone ; Customer c = GetCustomer( ); var x = new Name = c.name, Phone = c.phone ; Customer c = GetCustomer( ); var x = new c.name, c.phone ; public string Name; public string Phone; Inicializace s využitím projekce Anonymní typy??? var contacts = from c in customers where c.state == "WA" select new c.name, c.phone ; IEnumerable<???> var contacts = customers..where(c => c.state == "WA ).Select(c => new c.name, c.phone ); foreach (var c in contacts) Console.WriteLine(c.Name); Console.WriteLine(c.Phone); class??? public string Name; public string Phone; 31 32 8

Omezení anonymních typů Pouze lokální proměnné Deklarace musí obsahovat inicializaci Inicializátor musí být výraz Nesmí být objekt nebo kolekce objektů Typ incializačního výrazu nesmí být null Automatic properties public class Product string name; decimal price; public string Name get return name; set name = value; public decimal Price get return price; set price = value; private string ; public string Name get return ; set = value; public class Product public string Name get; set; public decimal Price get; set; Musí obsahovat jak get tak set 34 Partial Methods partial class Customer public string Name get Partial Method Call set OnNameChanging(value); _name = value; OnNameChanged(); Partial Method Definition partial void OnNameChanging(string value); partial void OnNameChanged(); 35 9