Nové prvky jazyka C# 2.0

Podobné dokumenty
Nové prvky jazyka Visual C# 2.0 (2005)

PREPROCESOR POKRAČOVÁNÍ

Generické programování

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

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

NULOVATELNÉ TYPY POD LUPOU

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

Zápis programu v jazyce C#

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

Programování v C++ 2, 4. cvičení

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

typová konverze typová inference

Úvod do programovacích jazyků (Java)

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

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

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

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

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.

Objektově orientované programování

Výčtový typ strana 67

Programování v C++ 1, 5. cvičení

Dědění, polymorfismus

Jakub Čermák Microsoft Student Partner

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

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Úvod do programovacích jazyků (Java)

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

Jazyk C# (seminář 6)

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

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

Základy objektové orientace I. Únor 2010

Kolekce, cyklus foreach

Programování v C++ 1, 6. cvičení

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.

Platforma.NET 4. hodina dnes to bude ideologické

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

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

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

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

20. Projekt Domácí mediotéka

Jazyk C# (seminář 3)

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

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

Abstraktní datové typy: zásobník

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

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

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

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

UJO Framework. revoluční architektura beans. verze

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

Seminář Java IV p.1/38

Assembler - 5.část. poslední změna této stránky: Zpět

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

Nové prvky v C# 3.0. David Keprt

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Abstraktní třídy, polymorfní struktury

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

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

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

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

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

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

Jazyk C# (seminář 3)

Jazyk C++ I. Šablony 2

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Seminář Java II p.1/43

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

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

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Dědičnost (inheritance)

Datové struktury. alg12 1

přetížení operátorů (o)

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

10 Balíčky, grafické znázornění tříd, základy zapozdření

Objektové programování

Dynamicky vázané metody. Pozdní vazba, virtuální metody

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

Základy programování (IZP)

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

3. Třídy. Základní pojmy objektového programování. Třídy

IRAE 07/08 Přednáška č. 7. Začátek (head)

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

Funkční objekty v C++.

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

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

1. Programování proti rozhraní

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

Programování v C++, 2. cvičení

Java Výjimky Java, zimní semestr

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Základní datové struktury

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

Software602 Form Designer

Jakub Čermák Microsoft Student Partner

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Transkript:

Nové prvky jazyka C# 2.0 Aleš Keprt Ales@Keprt.cz Verze 2006 Katedra informatiky Univerzita Palackého, Olomouc

Verze jazyka C# Specifikace C# není omezena jen na.net Zatím všechny implementace C# jsou v rámci platformy.net Verze: C# 1.0 pro.net 1.0 Visual C# 2002 C# 1.1 pro.net 1.1 Visual C# 2003 C# 2.0 pro.net 2.0 Visual C# 2005 2/54

Třináct nových prvků jazyka C# 1. Generické typy a metody 2. Iterátory 3. Částečně deklarované třídy 4. Nulovatelné typy 5. Bezejmenné metody, vnější proměnné 6. Operátor :: 7. Statické třídy 8. Zástupná jména seskupení 9. Odlišná přístupová práva pro get a set 10. Kovariance a kontravariance 11. Pole pevné délky 12. Spřátelená seskupení 13. Nevypisování varovných hlášení 3/54

1. Generické typy a metody Umožňují větší rozsah re-use Vhodné pro případy, kde se stejný kód opakuje pro různé datové typy Generické typy a metody jsou jakési vzory, jejichž instance jsou teprve skutečnými typy a metodami Pozn.: typy = třídy, struktury, rozhraní 4/54

Příklad generická funkce funkce pro záměnu hodnot dvou proměnných void swap<t>(ref T a, ref T b) { T c = a; a = b; T je jméno typového parametru b = c; } Použití: int a,b; swap<int>(ref a, ref b); swap(ref a, ref b); Zde jsme za T dosadili konkrétní typ int Typová inference (překladač rozumí, že tam má být <int>)

Příklad jednoduchý zásobník class Stack<T> { T[] data; int pos; public Stack() { data = new T[10]; pos = 0; } public void push(t value) { data[pos++] = value; if(pos >= data.length) pos = 0; } public T pop() { if(pos==0) pos = data.length; return data[--pos]; } 6/54

Příklad použití zásobníku Stack<string> s = new Stack<string>(); Výhody: Silná typová kontrola Bezpečnější kód Rychlejší kód (u hodnotových typů) Praktické důsledky na vývoj softwaru: Méně chyb Rychlejší vývoj Levnější vývoj 7/54

Kompilace generického kódu Kompilace probíhá jinak než v C++ Každý hodnotový typ má vlastní kód Všechny referenční typy sdílí jednu společnou instanci kódu Důvod: Samotná reference je vždy stejná Důsledek: Kratší programy 8/54

Omezení typových parametrů Základní operace s typovými parametry: Přiřazení Porovnání s null Volání metod třídy System.Object Ostatní jen s použitím klauzule where Klauzule where určuje, co vše typový parametr podporuje 9/54

where volání metod Metody, které chceme volat, umístíme do rozhraní Uvedeme požadavek where T:MyInterface Příklad: Generická metoda test_any() volá na svém parametru metodu test(): interface ITestable { void test(); } void test_any<t>(t obj) where T : ITestable { obj.test(); } 10/54

where vytváření nových objektů Uvedeme požadavek T:new() T create<t>() where T:new() { } return new T(); Použití: MyClass a = create<myclass>(); Platí jen pro konstruktor bez parametrů Není nutno používat při vytváření polí 11/54

where omezení na pouze hodnotové nebo referenční typy Omezení na referenční typy: class RefOnly<T> where T : class {...} Můžeme pak používat operátor as: var as Type Omezení na hodnotové typy: class ValueOnly<T>where T : struct {...} Znemožní porovnání s null struct zastupuje všechny hodnotové typy 12/54

where vícenásobná omezení Je možno uvádět více typových parametrů Lze definovat vztahy mezi parametry Příklad ukazuje požadavek na dědičnost: class MyClass<A, B, C> } where A : B,new() where B : C { vícenásobná omezení oddělena čárkou B a C jsou zde odhalené (naked) parametry Mezi dvěma where se nepíše žádný oddělovač Omezení new() musí být v seznamu poslední 13/54

Dědičnost zakázané konstrukce Typový parametr nemůže být předkem Následující příklad nefunguje: class Outer<T> { } class Inner : T {} 14/54

Dědičnost povolené konstrukce BaseType nám poslouží jako bázová třída class BaseType { } Tato generická třída je úplně samostatnou třídou! class BaseType<T> { } Type1 dědí konkrétní třídu BaseType class Type1 : BaseType { } Chyba! Nelze zde zjistit typ parametru T class Type2 : BaseType<T> { } Type3 je generická třída dědící z BaseType<T> class Type3<T> : BaseType<T> { } Type4 je generická třída dědící z BaseType<int> class Type4<T> : BaseType<int> { } 15/54

Typový parametr generické třídy lze používat ve všech jejích metodách (viz příklad se zásobníkem) 16/54 Co všechno může být generické Třídy (class) Struktury (struct) Rozhraní (interface) Metody Delegáty

Výchozí parametry (default) Slovo default zastupuje výchozí hodnotu typu int a = default(int); MyClass b = default(myclass); MyStruct c = default(mystruct); Použitelné i mimo generické programování Výchozí hodnota třídy je null Výchozí hodnota číselného typu je binární nula Výchozí hodnota struktury se zavádí rekurzivně jako výchozí hodnota všech jejích složek 17/54

(konec 1.části) 18/54

2. Iterátory Iterátor je programový blok obsahující příkaz yield Iterátory mají stejný účel jako enumerátory (viz příkaz foreach) Psát iterátory je MNOHEM snazší 19/54

Iterátory - příklad Přidáme podporu do našeho zásobníku: public IEnumerator<T> GetEnumerator(){ } } for(int i=0; i<pos; i++) { } yield return data[i]; A to je vše! tento iterátor je generický zde postupně jakoby vracíme jednotlivé hodnoty 20/54

Iterátory - implementace 1. Na začátku je volána metoda s.getenumerator(). 2. V místě příkazu yield je provádění kódu pozastaveno, je uchován kontext a hodnota data[i] je dosazena do proměnné v 3. Je provedeno tělo příkazu foreach(typ v in ). 4. Kontext je přepnut zpět do metody GetEnumerator a vykonávání pokračuje za příkazem yield opět až po další příkaz yield (můžeme tedy také umístit několik yield na různá místa v metodě). 5. Body 2 až 4 se opakují, dokud neskončí provádění metody GetEnumerator. Tím je ukončeno i provádění foreach. 21/54

Pojmenovaný iterátor Vytvoříme iterátor vracející pro dané N mocniny dvojky od 2 1 až po 2 N. IEnumerable Power(int N) { } int counter = 0; int result = 1; while(counter++ < N) { result *= 2; yield return result; } jméno iterátoru 22/54

Použití iterátorů Iterátory se používají stejně jako enumerátory Nepojmenovaný iterátor: foreach(string v in mystack) { } Console.WriteLine(v); Pojmenovaný iterátor: foreach(int i in Power(10)) { } Console.WriteLine(i); jméno objektu jméno metody 23/54

Předčasné ukončení iterace Příkaz yield return x; vrací další hodnotu Příkaz yield break; ukončí iteraci (obyčejné return; použít nelze) 24/54

3. Částečně deklarované třídy Třídu lze nyní deklarovat ve více souborech partial class MyClass : BaseClass, Interface1 { } partial class Inner<T> { } T a; první soubor partial class MyClass : Interface2 { partial class Inner<T> { T b; } } druhý soubor 25/54

Visual Studio 2005 používá tento konstrukt pro oddělení kódu formulářů na část generovanou v IDE a část psanou ručně 26/54 Pravidla částečných deklarací Je-li třída partial, musí tak být deklarována ve všech jejích částech Všechny části musejí být v jednom modulu Jména typů, generických parametrů, přístupová práva a modifikátory musejí ve všech částech souhlasit

4. Nulovatelné typy Hodnotové typy nemohou být null Např. při práci s SQL by se to však hodilo Nulovatelné typy jsou hodnotové typy, jimž lze přiřadit také null Deklarace: Přidáme otazník za název typu int? x; Console.WriteLine(x==null? "null" : x.value.tostring()); if(x.hasvalue) Console.WriteLine("x má hodnotu"); 27/54

Implementace nulovatelných typů Jsou to instance generického typu T? je totéž jako System.Nullable<T> Vlastnost HasValue vrací true/false Vlastnost Value vyvolá výjimku při null Konverze T? na T pouze explicitně Konverze T na T? je implicitní T? má všechny operátory jako T 28/54

Nulovatelné typy operace s null Výsledkem operací s null je vždy null Operátor?? umožní dosadit výchozí hodnotu int? x; int y = x?? -1; Je to totéž jako if(x==null) y=-1; else y=x; Operátor?? lze používat i bez nulovatelných typů Typ bool? je specifický poskytuje trojhodnotovou logiku (chová se stejně jako SQL typ Boolean) 29/54

5. Bezejmenné (anonymní) metody Přiblížení funkcionálním jazykům Vhodné pro psaní delegátů button.click += delegate {MessageBox.Show("Click!");}; 30/54

Vnější proměnné Bezejmenná metoda je samostatným blokem kódu, ale sdílí proměnné s nadřazeným blokem! int a = 0; button.click += delegate {MessageBox.Show((++a).ToString());}; a = 23; V tomto příkladu se všechno odkazuje na jedinou instanci hodnotové proměnné a Parametry ve formě ref a out se nesdílí 31/54

6. Operátor :: Zpřístupňuje (nejen) globální prostor jmen int System,Console; proměnná System blokuje prostor jmen System //Následující řádek fungovat nebude System.Console.WriteLine("Nefunguje!"); //Použijeme operátor :: global::system.console.writeline("ok"); Vlevo uvádíme slovo global nebo zástupné jméno prostoru jmen (namespace alias) 32/54

7. Statické třídy Píšeme jednoduše static class... Statická třída: Má jen statické součásti Nemá konstruktor (statický mít může) Nelze vytvářet instance Je zapečetěná (sealed nelze ji dědit) 33/54

8. Zástupná jména seskupení Potřebujeme odlišit dvě verze stejné komponenty Použijeme parametr překladače /r /r:komponenta_verze1=grid.dll /r:komponenta_verze2=grid20.dll V kódu si tyto komponenty zpřístupníme extern alias Komponenta_verze1; extern alias Komponenta_verze2; 34/54

9. Odlišná přístupová práva pro get a set Nově mohou mít get a set odlišná práva public string Name { get {return name;} } public protected set {name = value;} omezeno na protected Pravidla: 1. Vnitřní modifikátor musí být více restriktivní 2. Modifikovat lze jen jedno z get/set, ne obojí 35/54

Odlišná přístupová práva pro get a set Implementace rozhraní Implementace rozhraní není děděním Akcesor, který není součástí rozhraní, lze doplnit a nastavit mu jiná přístupová práva public interface MyInterface { } int MyProperty {get;} public class MyClass : MyInterface { } public int MyProperty { } get {...} protected set {...} public 36/54

10. Kovariance a kontravariance Obojí se týká delegátů Kovariance umožňuje použít metodu, jejíž návratový typ je potomkem návratového typu deklarovaného v delegátu Kontravariance umožňuje použít metodu s parametry, které jsou předky parametrů deklarovaných v delegátu 37/54

Kovariance a kontravariance příklad class A {} class B : A {} class C : B {} class Test { delegate B Metoda(B param); B MetodaA(A param) {...} C MetodaC(B param) {...} public Test() { Metoda ma = new Metoda(MetodaA); Metoda mc = new Metoda(MetodaC); } } definujeme strom dědičnosti delegát používá typ B A místo B: kontravariance C místo B: kovariance 38/54

11. Pole pevné délky V unsafe bloku lze deklarovat pole pevné délky, které je fyzicky uloženo na místě deklarace Je to hodnotový typ, neprovádí se kontrola přetečení bufferu atd. struct MyArray { } unsafe public fixed char path[256]; private int reserved; 39/54

12. Spřátelená seskupení Chceme-li, aby seskupení (assembly) B mělo přístup do všech (i neveřejných) součástí seskupení A, pak v seskupení A použijeme následující atribut: [assembly:internalsvisibleto ("B",PublicKeyToken="...")] Public key token je 8bajtová hodnota sloužící k rozlišení dvou stejně pojmenovaných seskupení (od různých autorů apod.) 40/54

13. Nevypisování varovných hlášení Vypisování varovných hlášení lze ovlivnit přímo v kódu, použitím nové direktivy #pragma warning disable 414,3021 #pragma warning restore 414,3021 Příklad zakáže a pak obnoví varovná hlášení číslo 414 a 3021 Tento konstrukt nelze použít pro povolení hlášení zakázaných nastavením překladače 41/54

(konec 2.části) 42/54

Analýza Celkem 13 nových prvků v jazyku Některé vyvolaly bouřlivé diskuze Žádná novinka není povinná, dosavadní kód bude i nadále fungovat 43/54

Analýza generické typy Je to nejvýznamnější novinka Není to stejné jako šablony v C++ Neříká se tomu šablony, ani templaty Vliv na knihovnu tříd BCL, zvláště kolekce Širší re-use, lepší typová kontrola Závěr: Je to velmi pozitivní věc 44/54

Analýza nulovatelné typy Zjednodušení práce s SQL Teze: Je to půlkrok k regulárním výrazům int? = žádný nebo jeden int int! = právě jeden int int+ = jeden nebo více intů int* = libovolný počet intů Problémy: Kolize int* s unsafe pointery Stále nám chybí i opak = nenulovatelné typy 45/54

Analýza zjednodušení práce Některé nové konstrukty zjednodušují práci: Iterátory Bezejmenné metody Odlišná přístupová prává pro get a set Kovariance a kontravariance 46/54

Analýza další novinky Operátor :: zpřístupní global namespace Částečné deklarace zpřehlední kód Ostatní novinky jsou již méně důležité, spíše kosmetické 47/54

(konec 3.části) 48/54

Novinky ve vývojovém prostředí (stručný přehled) 1. Refactoring kódu 2. Expanze podle vzoru 3. Chytrá kontextová nápověda v debuggeru 4. Chytřejší sledování kontextu v IntelliSense 5. Možnost zobrazit metadata jako zdroják a mnoho dalšího 49/54

1. Refactoring Rename Přejmenuje prvek v deklaraci i volání Bezpečnější, než klasické textové find & replace Extract method Z části kódu udělá samostatnou metodu Encapsulate field Datový prvek (proměnnou) zabalí do property Změní kód používající proměnnou na property 50/54

Refactoring (pokračování) Extract interface Vytvoří rozhraní podle existující třídy Promote local variable to parameter Povýší lokální proměnou na parametr volání Remove parameters Odstraní parametry z deklarace i volání Reorder parameters Změní pořadí parametrů v deklaraci i volání 51/54

2. Expanze podle vzoru Je to programování myší aneb Insert code snippet Tři možné aktivace: Lokální menu (pravým tlačítkem) Klávesová zkratka Ctrl+K,X Zadat název snippetu a zmáčknout 2x Tab Příklad foreach: foreach(object var in collection_to_loop) { } 52/54

Novinky v knihovně tříd BCL Base Class Library obsahuje také mnoho nových prvků (nad rámec této přednášky) 53/54

Mgr. Aleš Keprt, Ph.D., 2004-2006 Vytvořeno pro potřeby přednášky na UP Olomouc. Tento text není určen pro samostudium, ale jen jako vodítko pro přednášku, takže jeho obsah se může čtenáři zdát stručný, nekompletní či možná i chybný. Použití je povoleno jen na vlastní nebezpečí. V případě dalšího šíření tohoto dokumentu nebo i jeho kterékoliv části je NUTNO vždy uvést původního autora a odkaz na původní dokument. Komentáře můžete posílat emailem autorovi (adresu najdete pomocí Googlu). 54