Jakub Čermák <jakub@jcermak.cz> http://www.jcermak.cz Microsoft Student Partner
Úvod, příklady použití, trocha teorie Struktura aplikace Typy obecně, primitivní typy, speciální typy Podmínky, cykly, namespaces Třídy, vlastní typy Hodnotové typy Managed halda, referenční objekty Stack semantics pro referenční objekty Polymorfismus Viditelnost
Další součásti objektového modelu Eventy, property, rozhraní Generika, šablony Výjimky Pointery CLR Hosting
Referenční typ, jehož instance zapouzdřují metodu s danou signaturou Nelze použít stack semantics Deklarace delegate void MujDelegat(int n); Srovnej: typedef void (*MujUkazatel) (int n); Definice MujDelegat ^deleg = gcnew MujDelegat(fce); Nejde zkrátit Volání deleg(42);
Notifikace změn nějakého objektu Deklarace event EventHandler<EventArgs ^> ^evt; Registrace handlerů x->mojeudalost += gcnew EventHandler<EventArgs ^>(fce1); Úprava chování Přepsání submetod raise, add, remove Vlastní akce při změnách handleru, odlišení viditelnosti jednotlivých akcí
Name Title Group
Syntaktická zkratka za Get* a Set* metody Deklarace pomocí submetod get a set Obdobně jako u eventů Volání jako u proměnných
ref class Xsi { private: int x; public: property int MojeProperty // deklarace property { private: void set(int v) { x = v ; } //setter int get() { return x; } //getter } };
ref class Xsi { private: array<int, 2> ^x; public: property int MojeProperty[int, int] // deklarace property { void set(int i, int j, int val) { x[i,j] = v; } //setter, i a j je index, val je hodnota int get(int i, int j) { return x[i,j]; } //getter, i a j je index } };
Smečka abstraktních metod Ale i statických datových položek, funkcí a konstruktoru Vnořování Dědičnost
public interface class Interface_B : Interface_A { property int Property_Block; event ClickEventHandler^ OnClick; void Function_1(); static void Function_3() { Console::WriteLine("in Function_3"); } };
Šablonová třída Vkládání managed dat do nativních objektů class CppClass { public: gcroot<string^> str; CppClass() {} }; Automatická konverze z gcroot<t> na T
Atributy [Job( Access::Read, Priority=2 )] ref struct QueryService Extension metody Přímá podpora není Volání jako statická Deklarace: Atribut System::Runtime::CompilerServices::Extension
Další součásti objektového modelu Property, eventy, rozhraní Generika, šablony Výjimky Pointery CLR Hosting
Parametrizace typu bo funkce jiným typem nebo konstantou Vyhodnocení za kompilace, nelze za runtime Standardní z C++; funkční i pro managed Parciální specializace Šablonové třídy jako typový parametr template< template <class T1> class T2> Přístup k libovolným prvkům parametru Ověření při kompilaci Nemožnost systémově vynutit implementaci něčeho
template <typename T, int I> ref class TTrida { public: T hodnota; };
Parametrizace typu, funkce či delegátu jiným typem (ne konstanty) Vyhodnocení za runtime Možnost dynamicky vytvářet instance (reflection, jiné assembly) funkční jen pro managed Nefunguje parciální specializace Přístup jen k vlastnostem objectu, pokud není constraint
generic <typename T> ref class GTrida { public: T hodnota; };
Omezení kladená na typový parametr Vynucení dědičnosti z něčeho, nebo implementace rozhraní generic <typename T> where T : IComparable<T>, INěcoJinýho ref class Trida {}; Naked type constraint dědičnost z jiného typ. Parametru Bezparametrický konstruktor Where T : gcnew() Value class nebo ref class
Nesting Nejde Generická by nešla dynamicky instanciovat Template parametr použít pro generickou třídu OK Celé se to vyhodnotí při kompilaci Generický parametr použít pro template třídu V runtime nejde vytvořit instance template třídy
Další součásti objektového modelu Property, eventy, rozhraní Generika, šablony Výjimky Pointery CLR Hosting
Managed výjimky dědí od System::Exception Unmanaged výjimky vše ostatní Throw i try..catch stejný Použije se první vhodný catch blok Navíc finally blok Unmanaged výjimky se mapují na System::Runtime::InteropServices:: SEHException
Name Title Group
Další součásti objektového modelu Property, eventy, rozhraní Generika, šablony Výjimky Pointery CLR Hosting
Unmanaged ptr & reference Kus paměti Managed handles & reference Konkrétní objekt nebo jeho část Měnící se hodnota
Generická třída Připichování managed objektů Adresa objektu v paměti se nezmění Ekvivalent fixed konstruktu v C# Automatická konverze na pointer pin_ptr<int> p = &objekt->cislo;
Generická třída Podobnost s managed handle Updatován GC Automatická konverze na pointer interior_ptr<int> p = &objekt->cislo;
Další součásti objektového modelu Property, eventy, rozhraní Generika, šablony Výjimky Pointery CLR Hosting
Vlastní hostovací aplikace pro managed kód Default CLR host spouštění normálně V nativním procesu spustit.net VM Úprava/přepsání vlastností a fcí VM Paměť, assembly loading, vlákna, IO, synchronization, GC, failure policy, security... SetHostControl
Spec. podpora managed pluginů SQL Server IIS Server Asp.net Internet Browser applets ~ Java...
Name Title Group
Agenda Další součásti objektového modelu Eventy, property, rozhraní Generika, šablony Výjimky Pointery CLR Hosting Kontakt E-mail: jakub@jcermak.cz WWW: http://www.jcermak.cz
2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.