Hodnotové třídy a struktury (C++/CX)
Struktura hodnoty nebo třída hodnot je pod kompatibilní s prostředí Windows Runtime ("struktura prostých starých dat"). Má pevnou velikost a skládá se pouze z polí; na rozdíl od třídy ref nemá žádné vlastnosti.
Následující příklady ukazují, jak deklarovat a inicializovat struktury hodnot.
// in mainpage.xaml.h:
value struct TestStruct
{
Platform::String^ str;
int i;
};
value struct TestStruct2
{
TestStruct ts;
Platform::String^ str;
int i;
};
// in mainpage.cpp:
// Initialize a value struct with an int and String
TestStruct ts = {"I am a TestStruct", 1};
// Initialize a value struct that contains
// another value struct, an int and a String
TestStruct2 ts2 = {{"I am a TestStruct", 1}, "I am a TestStruct2", 2};
// Initialize value struct members individually.
TestStruct ts3;
ts3.i = 108;
ts3.str = "Another way to init a value struct.";
Když je proměnná typu hodnoty přiřazena k jiné proměnné, hodnota se zkopíruje, takže každá z těchto dvou proměnných má svou vlastní kopii dat. Struktura hodnoty je struktura s pevnou velikostí, která obsahuje pouze veřejná datová pole a je deklarována pomocí klíčového value struct
slova.
Třída hodnot je stejně jako s tím rozdílemvalue struct
, že její pole musí být explicitně udělena veřejné přístupnosti. Deklaruje se pomocí klíčového value class
slova.
Struktura hodnoty nebo třída hodnot mohou obsahovat jako pole pouze základní číselné typy, výčtové třídy, Platform::String^
nebo Platform::IBox <T>^ kde T je číselný typ nebo výčet třídy nebo třídy hodnot nebo struktury. Pole IBox<T>^
může mít hodnotu nullptr
– tak C++ implementuje koncept typů hodnot s možnou hodnotou null.
Hodnota třída nebo struktura hodnoty, která obsahuje Platform::String^
nebo IBox<T>^
typ jako člen není memcpy
-able.
Vzhledem k tomu, že všichni členové value class
nebo value struct
jsou veřejné a generují se do metadat, standardní typy C++ nejsou povolené jako členy. Liší se od tříd ref, které mohou obsahovat private
nebo internal
standardní typy jazyka C++.
Následující fragment kódu deklaruje Coordinates
a City
typy jako struktury hodnot. Všimněte si, že jedním z datových City
členů je GeoCoordinates
typ. A value struct
může obsahovat další struktury hodnot jako členy.
public enum class Continent
{
Africa,
Asia,
Australia,
Europe,
NorthAmerica,
SouthAmerica,
Antarctica
};
value struct GeoCoordinates
{
double Latitude; //or float64 if you prefer
double Longitude;
};
value struct City
{
Platform::String^ Name;
int Population;
double AverageTemperature;
GeoCoordinates Coordinates;
Continent continent;
};
Předávání parametrů pro typy hodnot
Pokud jako parametr funkce nebo metody máte typ hodnoty, obvykle se předává hodnotou. U větších objektů to může způsobit problém s výkonem. V sadě Visual Studio 2013 a starších byly typy hodnot v C++/CX vždy předány hodnotou. V sadě Visual Studio 2015 a novějších můžete předávat typy hodnot podle odkazu nebo podle hodnoty.
Pokud chcete deklarovat parametr, který předává typ hodnoty podle hodnoty, použijte kód podobný tomuto:
void Method1(MyValueType obj);
Chcete-li deklarovat parametr, který předává typ hodnoty odkazem, použijte symbol odkazu (&), jak je znázorněno v následujícím příkladu:
void Method2(MyValueType& obj);
Typ uvnitř Method2 je odkaz na MyValueType a funguje stejně jako typ odkazu ve standardním jazyce C++.
Když voláte metodu Method1 z jiného jazyka, jako je C#, nemusíte používat klíčové slovo ani out
horef
. Při volání Metody2 použijte ref
klíčové slovo.
Method2(ref obj);
K předání typu hodnoty podle odkazu můžete použít také symbol ukazatele (*). Chování volajících v jiných jazycích je stejné (volající v jazyce C# používají ref
klíčové slovo), ale v metodě je typ ukazatelem na typ hodnoty.
Typy hodnot s povolenou hodnotou Null
Jak už bylo zmíněno dříve, hodnota třídy nebo struktura hodnoty může mít pole typu Platform::IBox<T>^, například IBox<int>^
. Takové pole může mít libovolnou číselnou hodnotu, která je platná pro int
daný typ, nebo může mít hodnotu nullptr
. Pole s možnou hodnotou null můžete předat jako argument metodě, jejíž parametr je deklarován jako volitelný, nebo kdekoli jinde, kde není typ hodnoty vyžadován.
Následující příklad ukazuje, jak inicializovat strukturu, která má pole s možnou hodnotou null.
public value struct Student
{
Platform::String^ Name;
int EnrollmentYear;
Platform::IBox<int>^ GraduationYear; // Null if not yet graduated.
};
//To create a Student struct, one must populate the nullable type.
MainPage::MainPage()
{
InitializeComponent();
Student A;
A.Name = "Alice";
A.EnrollmentYear = 2008;
A.GraduationYear = ref new Platform::Box<int>(2012);
Student B;
B.Name = "Bob";
B.EnrollmentYear = 2011;
B.GraduationYear = nullptr;
IsCurrentlyEnrolled(A);
IsCurrentlyEnrolled(B);
}
bool MainPage::IsCurrentlyEnrolled(Student s)
{
if (s.GraduationYear == nullptr)
{
return true;
}
return false;
}
Samotná struktura hodnoty může být nullable stejným způsobem, jak je znázorněno zde:
public value struct MyStruct
{
public:
int i;
Platform::String^ s;
};
public ref class MyClass sealed
{
public:
property Platform::IBox<MyStruct>^ myNullableStruct;
};
Viz také
Systém typů (C++/CX)
Referenční zdroje k jazyku C++/CX
Referenční informace o oborech názvů
Referenční třídy a struktury (C++/CX)