Dela via


Egenskaper (C++/CX)

Windows Runtime-typer exponerar offentliga data som egenskaper. Klientkoden får åtkomst till egenskapen som en offentlig datamedlem. Internt implementeras egenskapen som ett block som innehåller en get-accessor-metod, en uppsättning accessor-metod eller både och. Genom att använda åtkomstmetoderna kan du utföra ytterligare åtgärder innan eller efter att du har hämtat värdet, till exempel kan du utlösa en händelse eller utföra valideringskontroller.

Anmärkningar

Värdet för en egenskap finns i en privat variabel, som kallas för lagringsplats, som är av samma typ som egenskapen. En egenskap kan innehålla både en uppsättningsåtkomstor, som tilldelar ett värde till lagringsplatsen och en get-accessor som hämtar värdet för lagringsplatsen. Egenskapen är skrivskyddad om den endast tillhandahåller en get-accessor, skrivskyddad om den endast tillhandahåller en uppsättningsåtkomst och läs-/skrivbehörighet (ändringsbar) om den ger båda åtkomsterna.

En trivial egenskap är en läs-/skrivegenskap som kompilatorn automatiskt implementerar accessorerna och säkerhetskopieringsarkivet för. Du har inte åtkomst till kompilatorns implementering. Du kan dock deklarera en anpassad egenskap och uttryckligen deklarera dess accessorer och lagringsplats. I en accessor kan du utföra valfri logik som du behöver, till exempel verifiera indata till den inställda åtkomstorn, beräkna ett värde från egenskapsvärdet, komma åt en databas eller starta en händelse när egenskapen ändras.

När en C++/CX ref-klass instansieras initieras dess minne noll innan konstruktorn anropas. Därför tilldelas alla egenskaper ett standardvärde på noll eller nullptr vid deklarationspunkten.

Exempel

I följande kodexempel visas hur du deklarerar och får åtkomst till en egenskap. Den första egenskapen, Name, kallas för en trivial egenskap eftersom kompilatorn automatiskt genererar en set accessor, get accessor och ett lagringsplats för säkerhetskopiering.

Den andra egenskapen, Doctor, är en skrivskyddad egenskap eftersom den anger ett egenskapsblock som uttryckligen deklarerar endast en get accessor. Eftersom egenskapsblocket deklareras måste du uttryckligen deklarera ett säkerhetskopieringsarkiv. det vill: den privata string^-variabeln, doctor_. Vanligtvis returnerar en skrivskyddad egenskap bara värdet för lagringsplatsen. Endast själva klassen kan ange värdet för lagringsplatsen, vanligtvis i konstruktorn.

Den tredje egenskapen, Quantity, är en skrivskyddad egenskap eftersom den deklarerar ett egenskapsblock som deklarerar både en set accessor och en get accessor.

Accessorn set utför ett användardefinierat giltighetstest på det tilldelade värdet. Och till skillnad från C# är namnvärdet bara identifieraren för parametern set i accessorn. Det är inte ett nyckelord. Om värdet inte är större än noll genereras Platform::InvalidArgumentException. Annars uppdateras säkerhetskopieringsarkivet, quantity_, med det tilldelade värdet.

Observera att en egenskap inte kan initieras i en medlemslista. Du kan naturligtvis initiera variabler för säkerhetskopieringsarkiv i en medlemslista.

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;
    }
};

Se även

typsystem
C++/CX-språkreferens
referens för namnområden