Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
środowisko wykonawcze systemu Windows typy uwidaczniają dane publiczne jako właściwości. Kod klienta uzyskuje dostęp do właściwości, takiej jak publiczny zestaw danych. Wewnętrznie właściwość jest implementowana jako blok, który zawiera metodę dostępu get, metodę dostępu zestawu lub oba te metody. Korzystając z metod dostępu, można wykonać dodatkowe akcje przed pobraniem lub po pobraniu wartości, na przykład można uruchomić zdarzenie lub wykonać kontrole poprawności.
Uwagi
Wartość właściwości jest zawarta w zmiennej prywatnej ( nazywanej magazynem zapasowym), która jest tym samym typem co właściwość. Właściwość może zawierać zarówno zestaw dostępu, który przypisuje wartość do magazynu zaplecza, jak i metodę pobierania, która pobiera wartość magazynu kopii zapasowych. Właściwość jest tylko do odczytu, jeśli zapewnia tylko metodę dostępu get, tylko zapis, jeśli zapewnia tylko zestaw dostępu i odczyt/zapis (modyfikowalny), jeśli zapewnia oba metody dostępu.
Właściwość trywialna to właściwość odczytu/zapisu, dla której kompilator automatycznie implementuje metody dostępu i magazyn pomocniczy. Nie masz dostępu do implementacji kompilatora. Można jednak zadeklarować właściwość niestandardową i jawnie zadeklarować jej metody dostępu i magazyn pomocniczy. W ramach metody dostępu można wykonać dowolną wymaganą logikę, taką jak weryfikowanie danych wejściowych do zestawu dostępu, obliczanie wartości z wartości właściwości, uzyskiwanie dostępu do bazy danych lub wyzwalanie zdarzenia w przypadku zmiany właściwości.
Po utworzeniu wystąpienia klasy ref języka C++/CX jego pamięć jest inicjowana zero przed wywołaniem konstruktora; w związku z tym wszystkie właściwości mają przypisaną wartość domyślną zero lub nullptr w punkcie deklaracji.
Przykłady
W poniższym przykładzie kodu pokazano, jak zadeklarować właściwość i uzyskać do jej dostępu. Pierwsza właściwość , jest znana jako Name, ponieważ kompilator automatycznie generuje set metodę dostępu, get metodę dostępu i magazyn pomocniczy.
Druga właściwość , , jest właściwością tylko do odczytu, Doctorponieważ określa blok właściwości, który jawnie deklaruje tylko metodę get dostępu. Ponieważ blok właściwości jest zadeklarowany, należy jawnie zadeklarować magazyn zapasowy; czyli prywatna zmienna String^, doctor_. Zazwyczaj właściwość tylko do odczytu zwraca wartość magazynu zaplecza. Tylko sama klasa może ustawić wartość magazynu zaplecza, zazwyczaj w konstruktorze.
Trzecia właściwość, , jest właściwością read-write, Quantityponieważ deklaruje blok właściwości, który deklaruje zarówno set metodę dostępu, jak i get metodę dostępu.
Akcesorium set wykonuje test ważności zdefiniowany przez użytkownika dla przypisanej wartości. W przeciwieństwie do języka C#, tutaj wartość nazwy jest tylko identyfikatorem parametru w metodzie set dostępu; nie jest to słowo kluczowe. Jeśli wartość nie jest większa niż zero, zgłaszana jest wartość Platform::InvalidArgumentException. W przeciwnym razie magazyn quantity_kopii zapasowych , zostanie zaktualizowany o przypisaną wartość.
Należy pamiętać, że nie można zainicjować właściwości na liście elementów członkowskich. Oczywiście można zainicjować tworzenie kopii zapasowych zmiennych magazynu na liście elementów członkowskich.
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;
}
};
Zobacz też
System typów
Dokumentacja języka C++/CX
Dokumentacja przestrzeni nazw