Jakub Čermák <
[email protected]> 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
Nástupce Managed Extensions for C++ Vylepšení jazyka C++ nebo nový CLR jazyk? Standard ECMA-372 Přímé volání managed kódu z nativního a naopak Mixed assembly
Visual Studio 2005 a výše (nebo Express edici)
Proč to použít Nativní knihovny, managed aplikace (nebo naopak) Nativní jádro, managed UI/komunikace/… Portování nativní aplikace do .NETu (nebo naopak)
Proč to nepoužít Komplikovanější syntax a použití (než C#) Interop režie, JIT (/clr:pure) Security (/clr:safe)
Vytvoření Vytvoření CLR projektu v New project Zapnout Project properties->CLR support
Funkce main int main(array<System::String ^> ^args)
Header (*.h) a code soubory (*.cpp) Stdafx.h #include knihovních hlaviček
Ú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
Dotazy
1. Primitivní typy Bool, (signed) char, wchar_t, double, float, __int64, int, short, void (NE STRING!) Stejné pro managed i nativní
2. „normální“ nativní typy – nespravované GC C++ class, struct Stack / nativní halda
3. managed hodnotové Stack / managed halda
4. managed referenční Managed halda (vždy)
5. Pointery, handly, reference (další slide)
Stejné jako v C++, navíc: ^ ... Definice managed handlů („pointerů“ na objekty managed haldy) Jen na celé objekty, mohou být null (nullptr) String ^a;
% ... Managed (tracking) reference I na jednotlivé membery, nemohou být null
Managed handly i reference ukazují vždy na daný objekt; updatovány při přesunu objektu po paměti (např. GC) Gcnew – obdoba new pro managed objekty
Jiná reprezentace i umístění (pole znaků vs. managed objekt) .NET: System.String C++: char *, std::string, CString char * Kopie: Marshal.StringToHGlobalAnsi, Marshal.PtrToStringAnsi Odkaz: pin_ptr<wchar_t *> PtrToStringChars(String ^) Konstruktor System::Stringu
Std::string, CString – přímá neexistuje
Nativní pole pořád stejné Managed pole Template třída cli::array [qualifiers] array<[qualifiers]type1[, dim]>^var = gcnew array
(val[,val...])
Type1 – formální typ pole Type2 – faktický typ pole (podpora kovariance) Dim – dimenze pole Val,.... – jednotlivé rozměry pole Type1 i type2 musí být primitivní nebo managed
Možnost jagged arrays: array<array ^> ^jagged
array ^jednodim_pole = gcnew array(42); array ^dalsi_pole = {1, 2, 3, 5}; array ^trojdim_pole = gcnew array(4,5,6);
Výčet hodnot Nativní enum Deklarace: Enum NazevEnumu { NE_prvek1, NE_prvek2, ... };
Použití: NazevEnumu t = NE_prvek2;
Managed enum Deklarace enum class NazevEnumu : typ { prvek1, prvek2, ... } Typ = „underlying type“
Použití: NazevEnumu t = NazevEnumu::prvek2;
Nativní: enum VectorVisTransformationType { VVT_LINEAR, VVT_ROOT, VVT_LOG }; Managed: public enum class day_char : char {sun, mon, tue, wed, thu, fri, sat};
Ú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
If, switch, while, for, ... zůstávají For each – iterace přes kolekci Iteruje přes IEnumerable Nebo jako C++ (operátor ++ a *) for each(typ iterační_proměnná in kolekce) { ... } Možnost iterace přes reference – změny hodnot v kolekci Výhoda oproti C#
Neplést s „for(int& x : my_array)“ v C++0x
std::vector vect; //stvoříme std::vector vect.push_back(4); vect.push_back(6); // naplníme ho for each(int i in vect) // a vypíšeme Console::WriteLine(i); // .... // + Demo ve VS: for each na nativním poli
// vyvoření jagged array pomocí foreache array<array ^> ^jagged = gcnew array<array ^>(5); //vytvoření v vnějšího pole for each (array ^% arr in jagged) arr = gcnew array(6);
Příklad: Thread v System::Threading Oddělování namespaců pomocí :: Globální using using namespace System::Threading;
Referencování assemblies #using <System.dll>
Deklarace Namespace System { Namespace Threading { ..... }
}
Ú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
Nic nového Omezení Nelze managed v nativní třídě Většinou nelze nativní typy v managed třídě
Stejné jako v C#, VB.NET Nulování hodnot Navíc jdou vytvářet na stacku i haldě Rozdíl oproti C#
value class Struktura { value struct Struktura {
}; };
Struct X class: defaultní viditelnost proměnných
Stejné jako v C#, VB.NET Pouze na managed haldě Přístup přes handly Dereference handlu: * Přístup k položkám: ->
Alokace přes gcnew Trida ^t = gcnew Trida();
Jednoduchá dědičnost
Konstruktor Metoda s názvem jako třída Volána při deklaraci nebo gcnew
Destruktor Bezparametrická metoda s názvem ~třída() Odpovídá Dispose Implikuje implementaci IDisposable
Finalizer Berparametrická metoda s názvem !Třída() Při ničení objektu GC
Trida t; // alokace referenčního typu „jakoby na stacku“ Ve skutečnosti alokace na haldě Přiřazení (např. t1 = t2;) Vyžaduje operator = provádějící kopírování t1 i t2 jsou pořád různé objekty, jen se stejným obsahem!
Předání funkci jako parametr pomocí copy ctoru Definovaná doba života Ne podle referencí (GC) Destruktor (Dispose) při vyjití z bloku
Omezení: 1 třída, ∞ rozhraní (dané .NETem) Nekombinovat nativní a managed třídy
Syntaktické odlišnosti: Klíčové slovo abstract u metody Ekvivalent „=0“
Override nebo new Povinně, za název metody při overridu nebo hidingu
Abstract u třídy Abstraktní třída nepovinné, způsobuje warning
Konstruktor VTable pointer ukazuje VŽDY na posl. potomka
Virtuals.cpp
public ref class Trida { public: static int X; protected private: int PP; };
Members:
Třídy: Private public
MSDN – referenční dokumentace, některé postupy http://vbnet.cz/ - článek o C++/CLI Ebooky na českém MSDN Od úplných programátorských začátků
Google, Bing
Ú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
Zatím neznámé datum Další vlastnosti objektového modelu Property, eventy, intefraces
Generika + šablony Výjimky Pointery Užší spolupráce nativních a managed dat Pokročilé hostování managed assembly v čistě nativní aplikaci
E-mail: [email protected] 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.