410 likes | 666 Views
Visual Studio 2005: C# 2.0. Dalibor Kačmář Academic Developer Evangelist Microsoft s.r.o. Agenda. Úvod Generika Neúplné typy Anonymní metody Iterátory Další C# rozšíření Novinky v prostředí Visual Studio 2005 Refaktoring kódu Závěr. Visual C# 2005.
E N D
Visual Studio 2005: C# 2.0 Dalibor Kačmář Academic Developer Evangelist Microsoft s.r.o.
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Visual C# 2005 • Visual C# 2005 přináší několik zásadních rozšíření jazyka včetně celé řady novinek ve vývojovém prostředí • Rozšíření jazyka • Podpora elegantního a rychlého typově bezpečného kódu • Zjednodušení některých úkolů programátora • Navržen s maximálním důrazem na kompatibilitu • Vylepšená produktivita • Refactoring, kódu a jeho formátování • Zdokonalené laděné • Datatipy, visualizéry …
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Píšeme univerzální kód • Knihovny velmi často využívají typobject • Umožňuje pracovat s daty libovolného typu • Použit pro položky, parametry a návratové hodnoty • Uvedená technika ale vytváří mnoho problémů • Chybějící typová kontrola při překladu • Lze použít nevhodné nebo nekompatibilní typy • Zbytečná provize při použití hodnotových typů • Boxing, unboxing a typová kontrola za běhu aplikace • Potenciální provize při použití referenčních typů • Typová kontrola za běhu aplikace při konverzi výsledků • Obtěžující a nevzhledné typové konverze
Příklady using System.Collections; // referenční typ – třída Pracovnik Stack seznam = new Stack(); // Parametr je typu object // Proběhne implicitní konverze seznam.Push( new Pracovnik() ); // Návratová hodnota je typu object // Potřebujeme explicitní konverzi Pracovnik zam = (Pracovnik) seznam.Pop(); // Hodnotový typ - integer Stack velikosti = new Stack(); // Proběhne Boxing sizes.Push( 42 ); // Proběhne Unboxing int size1 = (int) sizes.Pop(); // Nevhodné a překladač neodhalí sizes.Push( 77 ); sizes.Push( new Pracovnik() ); // Překlad v pořádku, ale nastane // výjimka InvalidCastException int size2 = (int) sizes.Pop();
Generika • Kód může být parametrizován typovými informacemi • Umožňuje vytváření šablon kódu • Konkrétní typ zadán až při použití • Podobné generikům známým z jazyků Eiffel a Ada a C++ šablonám • Můžeme vytvářet různé typy generik • Třídy, struktury, rozhraní, metody a delegáty • Významné přínosy při použití generik • Umožňuje silnou typovou kontrolu v době překladu • Méně kontroly za běhu aplikace a operací boxing a unboxing • Omezení nutnosti explicitních typových konverzí • Výsledkem je čistější, rychlejší a bezpečnější kód
Omezení • Specifikace požadavků na typové parametry • Zabezpečuje, že typy poskytují požadovanou funkcionalitu • Umožňuje silnější typovou kontrolu při překladu • Omezuje potřebu explicitních typových konverzí • Může omezit použitelnost výsledného generika • Existují tři typy omezení • Omezení třídy (Class constraint) • Zajišťuje odvození od specifické základní třídy • Omezení rozhraní (Interface constraint) • Zajišťuje typům implementaci specifického rozhraní • Omezení konstruktoru (Constructor constraint) • Zajišťuje existenci veřejného implicitního konstruktoru
Založení a použití generické třídy • Omezení generika • Výkonnost kódu
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Neúplné typy • Umožňují rozdělit implementaci do několika souborů • Platí pro třídy, struktury a rozhraní • Deklarovány typovým modifikátorem partial • Nabízí několik výhod • Větší implementace mohou být rozděleny • Uživatelský kód může být oddělen od generovaného kódu • Zabraňuje nástrojům přepsat uživatelské změny • Využito u WinForms a silně typových DataSetů • Více vývojářů může souběžně pracovat na stejném typu • Umožňuje code-beside na rozdíl od code-behind • Využito u ASP.NET 2.0 • Může ulehčit údržbu a řízení změn ve zdrojovém kódu
Využití neúplných typů • Rozdělení typu neovlivňuje výsledný kód • Všechny části musí být při překladu spojeny • Nelze rozšířit již jednou přeložený typ • Kód je kumulativní nebo nekumulativní • Kumulativní elementy jsou spojovány • Metody, položky a rozhraní • Nekumulativní elementy musí být stejné ve všech částech • Typ, viditelnost a základní třídu • Class View a navigační lišta zobrazuje vždy celý typ
Agenda • Úvod • Generika • Neúplné typy • Vlastnosti a indexery • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Anonymní metody • Některý kód je volán pouze přes delegáty • Např. event handlerya callback funkce • Použití tradičních metod se zdá být zbytečné • Anonymní metody poskytují elegantní řešení • Umožňuje psát kód delegátů jako ‘in-line’ • Lze použít všude kde je očekáván delegát • Včetně argumentů metod • Vytváří se klíčovým slovem delegate • Podobný lambda funkcím v jazycích Python a Lisp • Opřen o implicitní konverzi na typ delegate • Vyžaduje kompatibilní seznam parametrů a návratovou hodnotu
Parametry a stav • Seznam parametrů lze vynechat, pokud není požadován • Považován kompatibilní se všemi delegáty kromě těch, kteří mají out parametry • Odlišný od prázdného seznamu parametrů deklarovaného jako ‘()’ • Musí se stejně dodat, ve chvíli kdy je delegát volán • Lze přistupovat k lokálnímu stavu zaobalující metody • Zahrnuje lokání proměnné a parametry • Nazýváme je vnější (outer) proměnné anonymních metod • Vnější proměnné, na které se odkazujeme, se nazývají zachycené (captured) • Životnost zachycených vnějších proměnných je prodloužena • Alespoň po dobu životnosti anonymní metody
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Průchod kolekcí • Obecný požadavek na práci s kolekcí • C# obsahujevýraz foreach pro zjednodušení procesu • Prochází po jednotlivých položkách vhodné kolekce • Kolekce typicky implementují IEnumerable • Enumerovatelné typy typicky implementují IEnumerator • Můžeme používat silně typový kód místo rozhraní • Enumerační kód je někdy obtížné napsat public interface IEnumerator { object Current { get; } bool MoveNext(); void Reset(); } // System.Collections public interface IEnumerable { IEnumerator GetEnumerator(); }
Iterátor • Blok příkazů, které vytvoří seřazenou sekvenci • Vyznačuje se jedním nebo více výrazyyield • yield returnvytváří další hodnotu iterace • yield breakindikuje ukončení iterace • Může jít o tělo metody, pokud vrací odpovídající rozhraní • IEnumerator[< T >] nebo IEnumerable[< T >] • Kompilátor generuje většinu kódu • Implementaci enumerátoru • Vnořené třídy pro uchování stavu iterace • Každý iterátor má svůj vlastní stav • Odstraňuje problémy způsobné kolizemi iterátorů
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Modifikátory viditelnosti • Ve verzi 2.0 lze odlišit mezi viditelností přístupových metod u vlastností a indexerů • Běžné je požadovat public get avšak protected set • Lze modifikovat jednu nebo obě přístupové metody • Zbývající metoda přebere viditelnost z deklarace vlastnosti nebo indexeru • Viditelnost lze pouze více omezit public int this[ int i ] { get { return this.a[ i ]; } protected set { this.a[ i ] = value; } }
Dedukce delegátů • Překladač nyní umí odhadnout instanci delegáta • Používá stejný mechanismus jako u anonymních metod • Umožňuje přímé přiřazení metody instanci delegáta • Implicitně převedena na kompatibilní typ delegáta • Ve většině případů lze vypustit explicitní založení • Poskytuje elegantní syntaxi založení delegátů // C# 1.0 this.Load += new EventHandler( this.FormLoad ); this.Update( new CallBack( this.MyMethod ) ); // C# 2.0 this.Load += this.FormLoad; this.Update( this.MyMethod );
Statické třídy • Formalizuje existující návrhový vzor • Sealed class s privátním konstruktorem a statickými členy • Vhodné pro pomocné třídy a „globální“ metody • Překladač vynutí dodržení pravidel • Zajistí, že neexistují členské metody a data • Brání založení instance a dědičnosti • Statické třídy musí být odvozeny ze třídy object static class Utility { public static void ActivateLicence() {} } // Chyba! static class Tool : Utility {} // Chyba! Utility u = new Utility();
Alias kvalifikátor // C# 2.0 using System; namespace Imaging { public class Console {} public class System { public void Demo() { // Chyba! Console.Write("6x9"); // OK global::System.Console .Write("42"); } } } • Nový kvalifikátor pro globální jmenný prostor • Nový operátor ‘::’ • Aplikován na aliasy a jmenné prostory • Alias globalse odkazuje na kořen jmenného prostoru • Řeší různé problémy s rozlišením jména • Vhodné pokud jedna entita překrývá jinou • Podobné C++ scope resolution operátoru
#pragma • Nová direktiva#pragma • Používá se pro vydávání speciální instrukcí překladači • Aktuálně podporovány pouze „warning pragma“ • Umožňuje zakázat nebo povolit varování překladače • Využívá čárkami oddělený seznam varování • Neuvádějte "CS" před číslem varování // Zakáže warning CS0169 #pragma warning disable 0169 // Negeneruje warning int i; // Zapne warning CS0169 #pragma warning restore 0169 // Generuje Warning CS0169 int j = 1;
Typy s hodnou Null • Nelze přiřadit null hodnotovým typům • Problém pokud chápeme null jako „bez hodnoty“ místo „bez odkazu“ • Databázové sloupce s hodnotovými typy mohou mít hodnotu null • Řešení – nullable typy • Nullable<T> mohou uchovat hodnotu null • Nová syntaxe s operátorem ?
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Vlastnosti prostředí • Omezení verze jazyka (Build|Advanced) • Implicitně 2.0, ale lze omezit na ISO-1 (1.0) • Formátování kódu (Tools|Options|Text Editor|C#|Formatting) • Individuální nastavení pro jednotlivé elementy jazyka doprovozené názorným příkladem • Export a import nastavení (Tools|Import/Export Settings…) • Možnost přenášení a sdílení nastavení ve skupině programátorů a mezi počítači
Novinky editoru • Navigace • Zaznamenávají se všechny pohyby v/po souborech a mezi projekty • Možnost pohybu jako v IE (vpřed/vzad) • Práce se záložkami (otevřenými soubory) • Close All But This, Copy Full Path, … • Vyřešení nejasných typů • Přidá výraz using nebo FQN • Za předpokladu existující reference v projektu
Novinky editoru …pokračování • Code Definition okno • Zobrazuje definici toho co editujeme, read-only • Sledování změn • Žluté – přidáno/nepřeloženo, Zelené – přidáno/přeloženo • Code Snippet • Typické kusy kódu, které často píšeme • Konstrukce typu if-else, foreach, class, … • Lze vytvořit vlastní • Surround with – označený blok kódu lze umístit do těla snippetu
Novinky editoru - ladění • Instant watch • Vizualizéry • Přirozeně zobrazují složité proměnné • Dataset, Data Table, Text, XML, HTML, vlastní … • VS Host • Aplikační assembly jsou při ladění zavedeny do <app>.vshost.exe • Partial trust debuging, rychlejší start • Edit-and-Continue • Podobné VC++ 6.0 • Nelze provést jakoukoli změnu ovlivňující metadata • Přidat/ubrat metody, parametry, veřejné položky
Nové vlastnosti prostředí editoru • Nové vlastnosti ladění
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Co je to refaktoring? • Změna struktury kódu bez vlivu na to co dělá • Extrakce metody • Zaobalení položky • Extrakce rozhraní • Přejmenování • Změna deklarace (podpisu) • Extrakce parametru • Expanze • Napříč všemi projekty v řešení
Agenda • Úvod • Generika • Neúplné typy • Anonymní metody • Iterátory • Další C# rozšíření • Novinky v prostředí Visual Studio 2005 • Refaktoring kódu • Závěr
Závěrem • Rozšíření jazyka C# • Významně posilují produktivitu a bezpečnost vytvoření kódu • Navazují a podporují aktuální programovací praktiky • Novinky ve vývojovém prostředí Visual Studio 2005 • Zjednodušují a urychlují práci při psaní kódu • Významně zpříjemňují proces ladění
Informační zdroje • C# Developer Center na MSDN http://msdn.microsoft.com/vcsharp • C# Team Member Blogs http://msdn.microsoft.com/vcsharp/team/blogs/