Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A értékstruktúra vagy értékosztály windowsos futtatókörnyezettel kompatibilis POD ("egyszerű régi adatstruktúra"). Rögzített méretű, és csak mezőkből áll; a ref osztálytól eltérően nincs tulajdonsága.
Az alábbi példák bemutatják, hogyan deklarálhatja és inicializálhatja az értékstruktúra-szerkezeteket.
// 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.";
Ha egy értéktípusú változó egy másik változóhoz van rendelve, a rendszer átmásolja az értéket, hogy a két változó mindegyike saját másolatot készítsen az adatokról. Az értékstruktúra rögzített méretű struktúra, amely csak nyilvános adatmezőket tartalmaz, és a value struct kulcsszóval deklarálva van.
Az értékosztály olyan, mint egy value struct, azzal a kivételével, hogy a mezőknek explicit módon nyilvánosan hozzáférhetőnek kell lenniük. A value class kulcsszóval van deklarálva.
Az értékstruktúra vagy értékosztály csak alapvető numerikus típusokat, számosztályokat, Platform::String^vagy platformot tartalmazhat mezőként::IBox <T>^, ahol a T számtípus, számosztály vagy értékosztály vagy -struktúra. Egy IBox<T>^ mező értéke nullptrlehet – a C++ így valósítja meg null értékűfogalmát.
A tagként Platform::String^ vagy IBox<T>^ típust tartalmazó értékosztály vagy értékstruktúra nem memcpy-able.
Mivel a value class vagy value struct minden tagja nyilvános és metaadatként kerül kibocsátásra, normál C++ típusok nem lehetnek tagok. Ez eltér a ref osztályoktól, amelyek private vagy internal standard C++ típusokat tartalmazhatnak.
Az alábbi kódrészlet a Coordinates és City típusokat értékstruktúraként deklarálja. Figyelje meg, hogy az egyik City adattag egy GeoCoordinates típusú elem. A value struct más értékstruktúrákat is tartalmazhatnak tagként.
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;
};
Értéktípusok paraméterátadása
Ha függvényként vagy metódusparaméterként értéktípussal rendelkezik, azt általában érték adja át. Nagyobb objektumok esetén ez teljesítményproblémát okozhat. A Visual Studio 2013-ban és korábbi verzióiban a C++/CX értéktípusokat mindig érték adta át. A Visual Studio 2015-ben és újabb verzióiban hivatkozás vagy érték alapján adhat át értéktípusokat.
Egy értéktípust érték szerint átszelő paraméter deklarálásához használja a következőhöz hasonló kódot:
void Method1(MyValueType obj);
Ha olyan paramétert szeretne deklarálni, amely hivatkozás alapján ad át egy értéktípust, használja a hivatkozási szimbólumot (&), ahogyan az a következőkben is szerepel:
void Method2(MyValueType& obj);
A 2. metódusban található típus a MyValueType-ra való hivatkozás, és ugyanúgy működik, mint a standard C++-ban használt referenciatípus.
Ha más nyelvről (például C#) hívja meg az 1. metódust, nem kell használnia a ref vagy out kulcsszót. A Method2 meghívásakor használja a ref kulcsszót.
Method2(ref obj);
A mutatószimbólum (*) segítségével hivatkozással is átadhat értéktípust. A más nyelveken hívókkal kapcsolatos viselkedés ugyanaz (a C# hívói a ref kulcsszót használják), de a metódusban a típus az értéktípusra mutató mutató.
Null értékű értéktípusok
Ahogy korábban említettük, egy értékosztály vagy értékstruktúra Platform::IBox<T>^típusú mezővel rendelkezhet , például IBox<int>^. Egy ilyen mező bármilyen numerikus értékkel rendelkezhet, amely a int típusra érvényes, vagy nullptrértékkel is rendelkezhet. Argumentumként megadhat egy null értékű mezőt egy olyan metódusnak, amelynek paramétere nem kötelező, vagy bárhol máshol, ahol nincs szükség értékre.
Az alábbi példa bemutatja, hogyan inicializálható egy null értékű mezővel rendelkező szerkezet.
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;
}
Maga az értékstruktúra ugyanúgy null értékű lehet, mint az itt látható:
public value struct MyStruct
{
public:
int i;
Platform::String^ s;
};
public ref class MyClass sealed
{
public:
property Platform::IBox<MyStruct>^ myNullableStruct;
};
Lásd még:
Típusrendszer (C++/CX)
C++/CX nyelvi referencia
névterek hivatkozási
Ref osztályok és szerkezetek (C++/CX)