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. publicref class Typ pomocnika wewnętrznego w kodzie jest niedozwolony. Nie jest on widoczny w metadanych. Nawet w obiekcie public ref classnie wszystkie elementy członkowskie są widoczne. W poniższej tabeli wymieniono relację między specyfikatorami dostępu języka C++ w obiekcie public ref classi ś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.winmdlub 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, UInt32Int64UInt64Int32UInt16DoubleChar16SingleBooleani .String Język C++/CX obsługuje podstawowe typy liczbowe w domyślnej przestrzeni nazw jako uint16, , , int16int64uint32int32float32uint64float64i .char16 Boolean i String są również zdefiniowane w Platform przestrzeni nazw.

Język C++/CX definiuje uint8również wartość , równoważną unsigned charwartoś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_tklasy .

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ć publicułatwienia dostępu , private, protectedlub internal .

  • Może zawierać prywatne zagnieżdżone enumdefinicje , structlub class .

  • 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 getlub 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 betonowych, które są zgodne z ich odpowiednikami biblioteki standardowej języka C++.

Aby uzyskać więcej informacji, zobacz Kolekcje.

Typy szablonów ref class

privateTypy 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.

Elementy delegowane

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.

Wydarzenia

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_castrzutowania języka C++, dynamic_casti 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.

Zobacz też

Dokumentacja języka C++/CX