Eigenschaften (C++/CX)

Windows-Runtime Typen machen öffentliche Daten als Eigenschaften verfügbar. Clientcode greift auf die Eigenschaft wie auf einen öffentlichen Datenmember zu. Intern wird die Eigenschaft als Block implementiert, der eine "get"-Accessor-Methode, eine "set"-Accessor-Methode oder beide enthält. Durch Verwendung der Accessormethoden können Sie zusätzliche Aktionen ausführen, bevor oder nachdem Sie den Wert abrufen. Beispielsweise können Sie ein Ereignis auslösen oder Validierungsüberprüfungen durchführen.

Hinweise

Der Wert einer Eigenschaft ist in einer privaten Variable – dem Sicherungsspeicher– enthalten, der vom selben Typ wie die Eigenschaft ist. Eine Eigenschaft kann sowohl einen "set"-Accessor, der dem Sicherungsspeicher einen Wert zuweist, als auch einen "get"-Accessor enthalten, der den Wert des Sicherungsspeichers abruft. Die Eigenschaft ist schreibgeschützt, wenn sie nur einen "get"-Accessor aufweist. Sie ist lesegeschützt, wenn sie nur einen "set"-Accessor aufweist. Wenn beide Accessoren vorhanden sind, ist Lese-/Schreibzugriff (änderbar) möglich.

Eine triviale Eigenschaft ist eine Eigenschaft mit Lese-/Schreibzugriff, für die der Compiler automatisch die Accessoren und den Sicherungsspeicher implementiert. Sie haben keinen Zugriff auf die Implementierung des Compilers. Sie können jedoch eine benutzerdefinierte Eigenschaft deklarieren und deren Accessoren und Sicherungsspeicher explizit deklarieren. Innerhalb eines Accessors können Sie jede benötigte Logik ausführen, z. B. das Überprüfen der Eingabe für den "set"-Accessor, das Berechnen eines Werts vom Eigenschaftswert, den Zugriff auf eine Datenbank oder das Auslösen eines Ereignisses, wenn sich die Eigenschaft ändert.

Beim Instanziieren einer C++/CX-Verweisklasse wird ihr Speicher mit 0 (Null) initialisiert, bevor der Konstruktor aufgerufen wird. Daher wird allen Eigenschaften zum Zeitpunkt der Deklaration der Standardwert 0 oder "nullptr" zugewiesen.

Beispiele

Das folgende Codebeispiel zeigt, wie Sie eine Eigenschaft deklarieren und auf sie zugreifen. Die erste Eigenschaft, Name, ist als triviale Eigenschaft bekannt, da der Compiler automatisch einen set -Accessor, einen get -Accessor und einen Sicherungsspeicher generiert.

Die zweite Eigenschaft, Doctor, ist eine schreibgeschützte Eigenschaft, da sie einen Property-Block angibt, der explizit nur einen get -Accessor deklariert. Da der Property-Block deklariert wird, müssen Sie einen Sicherungsspeicher explizit deklarieren, das heißt, die private Zeichenfolgen^-Variable doctor_. In der Regel gibt eine schreibgeschützte Eigenschaft nur den Wert des Sicherungsspeichers zurück. Nur die Klasse selbst kann den Wert des Sicherungsspeichers festlegen. Dies geschieht normalerweise im Konstruktor.

Die dritte Eigenschaft, Quantity, ist eine Schreib/-Leseeigenschaft, da sie einen Property-Block deklariert, der sowohl einen set -Accessor als auch einen get -Accessor deklariert.

Der set -Accessor führt eine benutzerdefinierte Gültigkeitsüberprüfung für den zugeordneten Wert aus. Anders als bei C# ist hier der Name value nur der Bezeichner für den Parameter im set -Accessor. Er ist kein Schlüsselwort. Wenn value nicht größer als null ist, wird Platform::InvalidArgumentException ausgelöst. Andernfalls wird der Sicherungsspeicher quantity_mit dem zugeordneten Wert aktualisiert.

Beachten Sie, dass eine Eigenschaft nicht in einer Memberliste initialisiert werden kann. Sie können Sicherungsspeichervariablen natürlich in einer Memberliste initialisieren.

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

Siehe auch

Typsystem
C++-/CX-Programmiersprachenreferenz
Referenz zu Namespaces