Propriedades (C++/CX)

Os tipos do Windows Runtime expõem dados públicos como propriedades. O código de cliente acessa a propriedade como um datamember público. Internamente, a propriedade é implementada como um bloco que contém um método acessador get, um método acessador set ou ambos. Usando os métodos acessadores, você pode executar ações adicionais antes ou depois de recuperar o valor, por exemplo, você pode disparar um evento ou executar verificações de validação.

Comentários

O valor de uma propriedade está contido em uma variável particular — conhecida como repositório de backup— que é do mesmo tipo da propriedade. Uma propriedade pode conter um acessador set, que atribui um valor ao repositório de backup, e um acessador get que recupera o valor do repositório de backup. A propriedade será somente leitura se fornecer um acessador get, somente gravação se fornecer um acessador set, e leitura/gravação (modificável) se fornecer ambos os acessadores.

Uma propriedade trivial é uma propriedade de leitura/gravação para a qual o compilador implementa automaticamente os acessadores e o repositório de backup. Você não tem acesso à implementação do compilador. No entanto, você pode declarar uma propriedade personalizada e declarar explicitamente seus acessadores e repositório de backup. Em um acessador, você pode executar qualquer lógica que seja necessária, como validar a entrada para o acessador set, calcular um valor com base no valor da propriedade, acessar um banco de dados ou disparar um evento quando a propriedade for alterada.

Quando uma classe de referência C++/CX é instanciada, sua memória é inicializada do zero antes que seu construtor seja chamado; no entanto, são atribuídos valores de zero padrão a todas as propriedades ou nullptr no ponto de declaração.

Exemplos

O exemplo de código a seguir mostra como declarar e acessar uma propriedade. A primeira propriedade, Name, é conhecida como trivial porque o compilador gera automaticamente um acessador set , um acessador get e um repositório de backup.

A segunda propriedade, Doctor, é uma propriedade somente leitura porque especifica um bloco property que declara explicitamente apenas um acessador get . Como o bloco property é declarado, você deve declarar explicitamente um repositório de backup; ou seja, a variável String^ particular doctor_. Geralmente, uma propriedade somente leitura retorna apenas o valor do repositório de backup. Apenas a própria classe pode definir o valor do armazenamento de backup, normalmente no construtor.

A terceira propriedade, Quantity, é uma propriedade de leitura-gravação porque declara um bloco property que declara tanto um acessador set quanto um acessador get .

O acessador set executa um teste de validade definido pelo usuário no valor atribuído. E, diferentemente do C#, aqui o nome valor é apenas o identificador do parâmetro no acessador set ; não é uma palavra-chave. Se o valor não for maior que zero, será gerada a Platform::InvalidArgumentException. Caso contrário, o repositório de backup, quantity_, será atualizado com o valor atribuído.

Observe que uma propriedade não pode ser inicializada em uma lista de membros. Naturalmente, você pode inicializar variáveis de armazenamento de backup em uma lista de membros.

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

Confira também

Sistema de tipos
Referência da linguagem C++/CX
Referência de namespaces