Sdílet prostřednictvím


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)