Omówienie systemu typów (C++/CX)
Korzystając z architektury środowisko wykonawcze systemu Windows, można użyć języków C++/WinRT, C++/CX, Visual Basic, Visual C# i JavaScript do pisania aplikacji i składników. Mogą oni bezpośrednio uzyskiwać dostęp do interfejsu API systemu Windows i współpracować z innymi aplikacjami i składnikami środowisko wykonawcze systemu Windows. platforma uniwersalna systemu Windows (UWP) aplikacje napisane w języku C++ kompilują się do kodu natywnego wykonywanego bezpośrednio w procesorze CPU. Aplikacje platformy UWP napisane w języku C# lub Visual Basic kompilują się w języku Microsoft Intermediate Language (MSIL) i są wykonywane w środowisku uruchomieniowym języka wspólnego (CLR). Aplikacje platformy UNIWERSALNEJ systemu Windows napisane w języku JavaScript są wykonywane w środowisku uruchomieniowym Języka JavaScript. Składniki systemu operacyjnego środowisko wykonawcze systemu Windows są zapisywane w języku C++ i uruchamiane jako kod natywny. Wszystkie te składniki i aplikacje platformy UWP komunikują się bezpośrednio za pośrednictwem interfejsu binarnego aplikacji środowisko wykonawcze systemu Windows (ABI).
Aby włączyć obsługę środowisko wykonawcze systemu Windows w nowoczesnym idiomie języka C++, firma Microsoft utworzyła rozszerzenie języka C++/CX. Język C++/CX udostępnia wbudowane typy podstawowe i implementacje podstawowych typów środowisko wykonawcze systemu Windows. Te typy umożliwiają aplikacjom i składnikom języka C++ komunikowanie się w usłudze ABI z aplikacjami napisanymi w innych językach. Aplikacje C++/CX mogą korzystać z dowolnego typu środowisko wykonawcze systemu Windows. Mogą również tworzyć klasy, struktury, interfejsy i inne typy zdefiniowane przez użytkownika, z których mogą korzystać inne aplikacje i składniki platformy UWP. Aplikacja platformy UWP napisana w języku C++/CX może również używać zwykłych klas i struktur języka C++, o ile nie mają one dostępu publicznego.
Aby zapoznać się ze szczegółowym omówieniem projekcji języka C++/CX i sposobu jej działania w ramach okładek, zobacz następujące wpisy w blogu:
Uwaga
Mimo że język C++/CX jest nadal obsługiwany, zalecamy użycie języka C++/WinRT dla nowych aplikacji i składników środowisko wykonawcze systemu Windows. Została zaprojektowana tak, aby zapewnić dostęp pierwszej klasy do nowoczesnego interfejsu API systemu Windows. Pomimo nazwy język C++/WinRT używa tylko standardowego języka C++17 bez rozszerzeń. Używa biblioteki tylko nagłówka do implementowania projekcji języka C++ dla interfejsów API środowisko wykonawcze systemu Windows. Język C++/WinRT jest dostępny w zestawie Windows SDK w wersji 1803 (10.0.17134.0).
Pliki metadanych systemu Windows (winmd)
Podczas kompilowania aplikacji platformy UWP napisanej w języku C++, kompilator generuje plik wykonywalny w kodzie maszyny natywnej, a także generuje oddzielny plik metadanych systemu Windows (.winmd
), który zawiera opisy typów publicznych środowisko wykonawcze systemu Windows, które obejmują klasy, struktury, wyliczenia, interfejsy, sparametryzowane interfejsy i delegaty. Format metadanych przypomina format używany w zestawach programu .NET Framework. W składniku .winmd
języka C++ plik zawiera tylko metadane; kod wykonywalny znajduje się w osobnym pliku. Ten układ jest używany przez składniki środowisko wykonawcze systemu Windows dołączone do systemu Windows. .winmd
Nazwa pliku musi być zgodna lub być prefiksem głównej przestrzeni nazw w kodzie źródłowym. (W przypadku języków .winmd
.NET Framework plik zawiera zarówno kod, jak i metadane, podobnie jak zestaw .NET Framework).
Metadane w .winmd
pliku reprezentują opublikowaną powierzchnię kodu. Opublikowane typy są widoczne dla innych aplikacji platformy UWP bez względu na język, w jakim są napisane inne aplikacje. Metadane lub opublikowany kod mogą zawierać tylko typy określone przez system typów środowisko wykonawcze systemu Windows. Nie można publikować konstrukcji języka C++, takich jak zwykłe klasy, tablice, szablony lub kontenery standardowej biblioteki C++ (STL). Aplikacja kliencka JavaScript lub C# nie wiedziałaby, co z nimi zrobić.
To, czy typ lub metoda jest widoczna w metadanych, zależy od tego, jakie modyfikatory ułatwień dostępu są do niego stosowane. Aby być widocznym, typ musi być zadeklarowany w przestrzeni nazw i musi być zadeklarowany jako public
. public
ref class
Typ pomocnika wewnętrznego w kodzie jest niedozwolony. Nie jest on widoczny w metadanych. Nawet w obiekcie public ref class
nie wszystkie elementy członkowskie są widoczne. W poniższej tabeli wymieniono relację między specyfikatorami dostępu języka C++ w obiekcie public ref class
i środowisko wykonawcze systemu Windows widoczności metadanych:
Opublikowane w metadanych | Nieopublikowany w metadanych |
---|---|
public |
private |
protected |
internal |
public protected |
private protected |
Aby wyświetlić zawartość .winmd
plików, możesz użyć przeglądarki obiektów. Składniki środowisko wykonawcze systemu Windows dołączone do systemu Windows znajdują się w Windows.winmd
pliku . Plik default.winmd
zawiera podstawowe typy używane w języku C++/CX i platform.winmd
zawiera typy z Platform
przestrzeni nazw. Domyślnie te trzy .winmd
pliki są uwzględniane w każdym projekcie języka C++ dla aplikacji platformy UWP.
Napiwek
Typy w Platform::Collections
przestrzeni nazw nie są wyświetlane w .winmd
pliku, ponieważ nie są publiczne. Są to prywatne implementacje interfejsów specyficzne dla języka C++, które są zdefiniowane w pliku Windows::Foundation::Collections
. Aplikacja środowisko wykonawcze systemu Windows napisana w języku JavaScript lub C# nie wie, czym Platform::Collections::Vector
jest klasa, ale może korzystać z klasy Windows::Foundation::Collections::IVector
. Typy Platform::Collections
są definiowane w pliku collection.h
.
system typów środowisko wykonawcze systemu Windows w języku C++/CX
W poniższych sekcjach opisano główne funkcje systemu typów środowisko wykonawcze systemu Windows oraz sposób ich obsługi w języku C++/CX.
Przestrzenie nazw
Wszystkie typy środowisko wykonawcze systemu Windows muszą być zadeklarowane w przestrzeni nazw. Sam interfejs API systemu Windows jest uporządkowany według przestrzeni nazw. Plik .winmd
musi mieć taką samą nazwę, jaką ma główna przestrzeń nazw. Na przykład klasę o nazwie A.B.C.MyClass
można utworzyć wystąpienie tylko wtedy, gdy jest ona zdefiniowana w pliku metadanych o nazwie A.winmd
, A.B.winmd
lub A.B.C.winmd
. Nazwa biblioteki DLL nie jest wymagana do dopasowania .winmd
nazwy pliku.
Sam interfejs API systemu Windows został na nowo wynaleziony jako dobrze uwzględniona biblioteka klas zorganizowana przez przestrzenie nazw. Wszystkie składniki środowisko wykonawcze systemu Windows są deklarowane w Windows.*
przestrzeniach nazw.
Aby uzyskać więcej informacji, zobacz Przestrzenie nazw i widoczność typu.
Typy podstawowe
Środowisko wykonawcze systemu Windows definiuje następujące typy podstawowe: UInt8
, , Int16
, UInt32
Int64
UInt64
Int32
UInt16
Double
Char16
Single
Boolean
i .String
Język C++/CX obsługuje podstawowe typy liczbowe w domyślnej przestrzeni nazw jako uint16
, , , int16
int64
uint32
int32
float32
uint64
float64
i .char16
Boolean
i String
są również zdefiniowane w Platform
przestrzeni nazw.
Język C++/CX definiuje uint8
również wartość , równoważną unsigned char
wartości , która nie jest obsługiwana w środowisko wykonawcze systemu Windows i nie może być używana w publicznych interfejsach API.
Podstawowy typ może być dopuszczany do wartości null, opakowując go w interfejsie Platform::IBox
. Aby uzyskać więcej informacji, zobacz Klasy wartości i struktury.
Aby uzyskać więcej informacji na temat typów podstawowych, zobacz Podstawowe typy
Ciągi
Ciąg środowisko wykonawcze systemu Windows jest niezmienną sekwencją 16-bitowych znaków UNICODE. Ciąg środowisko wykonawcze systemu Windows jest przewidywany jako Platform::String^
. Ta klasa udostępnia metody budowy, manipulowania ciągami i konwersji na i z wchar_t
klasy .
Aby uzyskać więcej informacji, zobacz Ciągi.
Tablice
Środowisko wykonawcze systemu Windows obsługuje jednowymiarowe tablice dowolnego typu. Tablice tablic nie są obsługiwane. W języku C++/CX tablice środowisko wykonawcze systemu Windows są przewidywane jako Platform::Array
klasa.
Aby uzyskać więcej informacji, zobacz tematy Array
oraz WriteOnlyArray
.
ref class
i ref struct
typy
Klasa środowisko wykonawcze systemu Windows jest przewidywana w języku C++/CX jako ref class
typ lubref struct
, ponieważ jest kopiowana przez odwołanie. Zarządzanie pamięcią dla ref class
obiektów i ref struct
jest obsługiwane w sposób niewidoczny przez zliczanie odwołań. Gdy ostatnie odwołanie do obiektu wykracza poza zakres, obiekt zostanie zniszczony. Typ ref class
lub ref struct
może:
Zawierają jako konstruktory składowe, metody, właściwości i zdarzenia. Ci członkowie mogą mieć
public
ułatwienia dostępu ,private
,protected
lubinternal
.Może zawierać prywatne zagnieżdżone
enum
definicje ,struct
lubclass
.Może bezpośrednio dziedziczyć z jednej klasy bazowej i może implementować dowolną liczbę interfejsów. Wszystkie
ref class
obiekty są niejawnie konwertowane na klasęPlatform::Object
i mogą zastąpić jej metody wirtualne — na przykład .Object::ToString
Element ref class
, który ma publiczny konstruktor, musi być zadeklarowany jako sealed
, aby zapobiec dalszemu wyprowadzaniu.
Aby uzyskać więcej informacji, zobacz Ref classes and structs (Klasy i struktury ref)
value class
i value struct
typy
Obiekt value class
lub value struct
reprezentuje podstawową strukturę danych i zawiera tylko pola, które mogą być value class
typami, value struct
typami lub typem Platform::String^
. value struct
obiekty i value class
są kopiowane według wartości.
Element value struct
może być dopuszczany do wartości null, opakowując go w interfejsie IBox
.
Aby uzyskać więcej informacji, zobacz Klasy wartości i struktury.
Klasy częściowe
Funkcja klasy częściowej umożliwia zdefiniowanie jednej klasy w wielu plikach. Umożliwia ona narzędzi do generowania kodu, takich jak edytor XAML, modyfikowanie jednego pliku bez dotykania innego edytowanego pliku.
Aby uzyskać więcej informacji, zobacz Klasy częściowe
Właściwości
Właściwość jest publicznym elementem członkowskim danych dowolnego typu środowisko wykonawcze systemu Windows. Jest zadeklarowany i zdefiniowany za pomocą słowa kluczowego property
. Właściwość jest implementowana jako get
/set
para metod. Kod klienta uzyskuje dostęp do właściwości tak, jakby był to pole publiczne. Właściwość, która nie wymaga niestandardowego get
lub set
kodu, jest znana jako właściwość trywialna i może być zadeklarowana bez jawnych get
lub set
metod.
Aby uzyskać więcej informacji, zobacz Właściwości.
kolekcje środowisko wykonawcze systemu Windows w języku C++/CX
Środowisko wykonawcze systemu Windows definiuje zestaw interfejsów dla typów kolekcji, które każdy język implementuje na swój sposób. Język C++/CX udostępnia implementacje w Platform::Collections::Vector
klasie, Platform::Collections::Map
klasie i innych powiązanych typach kolekcji, które są zgodne z ich odpowiednikami biblioteki standardowej języka C++.
Aby uzyskać więcej informacji, zobacz Kolekcje.
Typy szablonów ref class
private
Typy dostępu ref class
i internal
mogą być szablony i wyspecjalizowane.
Aby uzyskać więcej informacji, zobacz Klasy ref szablonów.
Interfejsy
Interfejs środowisko wykonawcze systemu Windows definiuje zestaw właściwości publicznych, metod i zdarzeń, które ref class
muszą implementować typ lubref struct
, jeśli dziedziczy z interfejsu.
Aby uzyskać więcej informacji, zobacz Interfejsy.
Wyliczenia
Typ enum class
w środowisko wykonawcze systemu Windows przypomina zakres enum
w języku C++. Typ bazowy to int32
, chyba że jest stosowany atrybut [Flags] — w tym przypadku bazowym typem jest uint32
.
Aby uzyskać więcej informacji, zobacz wyliczenia.
Delegaci
Delegat w środowisko wykonawcze systemu Windows jest analogiczny do std::function
obiektu w języku C++. Jest to specjalny ref class
typ używany do wywoływania funkcji udostępnianych przez klienta, które mają zgodne podpisy. Delegaty są najczęściej używane w środowisko wykonawcze systemu Windows jako typ zdarzenia.
Aby uzyskać więcej informacji, zobacz Delegaty.
Wyjątki
W języku C++/CX można przechwytywać niestandardowe typy wyjątków, std::exception
typy i Platform::Exception
typy.
Aby uzyskać więcej informacji, zobacz Wyjątki.
Zdarzenia
Zdarzenie jest publicznym elementem członkowskim w obiekcie ref class
lub ref struct
, którego typ jest typem delegata. Zdarzenie może być wywoływane — czyli wyzwalane — przez klasę będącą właścicielem. Jednak kod klienta może udostępniać własne funkcje obsługi zdarzeń, które są wywoływane podczas uruchamiania zdarzenia przez klasę będącą właścicielem.
Aby uzyskać więcej informacji, zobacz Zdarzenia.
Rzutowanie
Język C++/CX obsługuje standardowe operatory static_cast
rzutowania języka C++, dynamic_cast
i reinterpret_cast
, a także safe_cast
operator specyficzny dla języka C++/CX.
Aby uzyskać więcej informacji, zobacz Rzutowanie.
Konwersja boxing
Zmienna skrzynkowa to typ wartości opakowany w typ odwołania. Używaj zmiennych skrzynkowych w sytuacjach, w których wymagane są semantyka odwołań.
Aby uzyskać więcej informacji, zobacz Boxing.
Atrybuty
Atrybut jest wartością metadanych, którą można zastosować do dowolnego elementu członkowskiego typu lub typu środowisko wykonawcze systemu Windows. Atrybuty można sprawdzić w czasie wykonywania. Środowisko wykonawcze systemu Windows definiuje zestaw typowych atrybutów w Windows::Foundation::Metadata
przestrzeni nazw. Atrybuty zdefiniowane przez użytkownika w interfejsach publicznych nie są obsługiwane przez środowisko wykonawcze systemu Windows w tej wersji.
Wycofanie interfejsu API
Publiczne interfejsy API można oznaczyć jako przestarzałe przy użyciu tego samego atrybutu, który jest używany przez typy systemu środowisko wykonawcze systemu Windows.
Aby uzyskać więcej informacji, zobacz Przestarzałe typy i elementy członkowskie.