Megosztás:


Tulajdonságok (C++/CX)

A Windows futtatókörnyezet típusai tulajdonságokként teszik elérhetővé a nyilvános adatokat. Az ügyfélkód úgy fér hozzá a tulajdonsághoz, mint egy nyilvános adatelem. A tulajdonság belsőleg egy blokkként van implementálva, amely tartalmaz egy get accessor metódust, egy beállított tartozékmetódust vagy mindkettőt. A kiegészítő módszerek használatával további műveleteket hajthat végre az érték lekérése előtt vagy után, például aktiválhat egy eseményt, vagy érvényesítési ellenőrzéseket hajthat végre.

Megjegyzések

A tulajdonság értéke egy privát változóban ( más néven háttértárban) található, amely megegyezik a tulajdonság típusával. A tulajdonság tartalmazhat egy készlethez tartozó kiegészítőt is, amely egy értéket rendel a háttértárhoz, valamint egy get kiegészítőt, amely lekéri a háttértár értékét. A tulajdonság írásvédett, ha csak beolvasási kiegészítőt, írásvédettet biztosít, ha csak egy beállított tartozékot biztosít, és olvasási/írási (módosítható), ha mindkét tartozékot biztosítja.

A triviális tulajdonság egy olvasási /írási tulajdonság, amelyhez a fordító automatikusan implementálja a tartozékokat és a háttértárat. Nincs hozzáférése a fordító implementálásához. Deklarálhat azonban egy egyéni tulajdonságot, és explicit módon deklarálhatja annak tartozékait és háttértárolóját. A tartozékon belül bármilyen szükséges logikát végrehajthat, például érvényesítheti a beállított tartozék bemenetét, kiszámíthat egy értéket a tulajdonságértékből, hozzáférhet egy adatbázishoz, vagy aktiválhat egy eseményt, amikor a tulajdonság megváltozik.

C++/CX ref osztály példányosításakor a memóriája nulla inicializálva lesz a konstruktor meghívása előtt; ezért minden tulajdonsághoz nulla vagy nullptr alapértelmezett érték van rendelve a deklarálási ponton.

Példák

Az alábbi példakód bemutatja, hogyan deklarálhat és érhet el egy tulajdonságot. Az első tulajdonság, az úgynevezett triviális tulajdonság, Namemivel a fordító automatikusan létrehoz egy set tartozékot, get egy tartozékot és egy háttértárat.

A második tulajdonság egy írásvédett tulajdonság, Doctormivel olyan tulajdonságblokkot határoz meg, amely kifejezetten csak egy tartozékot get deklarál. Mivel a tulajdonságblokk deklarálva van, explicit módon deklarálnia kell egy háttértárat; azaz a private String^ változó. doctor_ Egy írásvédett tulajdonság általában csak a háttértár értékét adja vissza. A háttértár értékét csak maga az osztály állíthatja be, általában a konstruktorban.

A harmadik tulajdonság egy írási-olvasási tulajdonság, Quantitymert deklarál egy tulajdonságblokkot, amely a tartozékot set és a tartozékot get is deklarálja.

A set tartozék felhasználó által meghatározott érvényességi tesztet végez a hozzárendelt értéken. A C#-sal ellentétben itt a névérték csak a tartozék paraméterének set azonosítója, nem kulcsszó. Ha az érték nem nagyobb nullánál, akkor a platform::InvalidArgumentException ki lesz dobva. Ellenkező esetben a háttértár quantity_frissül a hozzárendelt értékkel.

Vegye figyelembe, hogy egy tulajdonság nem inicializálható taglistában. Természetesen inicializálhatja a háttértár változóit egy taglistában.

public ref class Prescription sealed
{
private:
    Platform::String^ m_doctor;
    int quantity;
public:
    Prescription(Platform::String^ name, Platform::String^ d) : m_doctor(d)
    {
        // Trivial properties can't be initialized in member list.
        Name = name;
    }

    // Trivial property
    property Platform::String^ Name;

    // Read-only property
    property Platform::String^ Doctor
    {
        Platform::String^ get() { return m_doctor; }
    }

    // Read-write property
    property int Quantity
    {
        int get() { return quantity; }
        void set(int value)
        {
            if (value <= 0) 
            { 
                throw ref new Platform::InvalidArgumentException(); 
            }
            quantity = value;
        }
    }
};

public ref class PropertyConsumer sealed
{
private:
    void GetPrescriptions()
    {
        Prescription^ p = ref new Prescription("Louis", "Dr. Who");
        p->Quantity = 5;
        Platform::String^ s = p->Doctor;
        int32 i = p->Quantity;

        Prescription p2("JR", "Dr. Dat");
        p2.Quantity = 10;
    }
};

Lásd még

Típus rendszer
C++/CX nyelvi referencia
Névterek – referencia