Como declarar e usar propriedades de leitura e gravação (Guia de Programação em C#)

As propriedades oferecem a conveniência de membros de dados públicos sem os riscos associados ao acesso sem proteção, sem controle e não verificado aos dados de um objeto. Propriedades declaram acessadores: métodos especiais que atribuem e recuperam valores do membro de dados subjacente. O acessador set habilita a atribuição de membros de dados e o acessador get recupera valores do membro de dados.

Este exemplo mostra uma classe Person que tem duas propriedades: Name (string) e Age (int). Ambas as propriedades fornecem acessadores get e set, portanto, são consideradas propriedades de leitura/gravação.

Exemplo

class Person
{
    private string _name = "N/A";
    private int _age = 0;

    // Declare a Name property of type string:
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    // Declare an Age property of type int:
    public int Age
    {
        get
        {
            return _age;
        }

        set
        {
            _age = value;
        }
    }

    public override string ToString()
    {
        return "Name = " + Name + ", Age = " + Age;
    }
}

public class Wrapper
{
    private string _name = "N/A";
    public string Name
    {
        get
        {
            return _name;
        }
        private set
        {
            _name = value;
        }
    }

}

class TestPerson
{
    static void Main()
    {
        // Create a new Person object:
        Person person = new Person();

        // Print out the name and the age associated with the person:
        Console.WriteLine("Person details - {0}", person);

        // Set some values on the person object:
        person.Name = "Joe";
        person.Age = 99;
        Console.WriteLine("Person details - {0}", person);

        // Increment the Age property:
        person.Age += 1;
        Console.WriteLine("Person details - {0}", person);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Person details - Name = N/A, Age = 0
    Person details - Name = Joe, Age = 99
    Person details - Name = Joe, Age = 100
*/

Programação robusta

No exemplo anterior, as propriedades Name e Age são públicas e incluem os acessadores get e set. Os acessadores públicos permitem que qualquer objeto leia e grave essas propriedades. No entanto, às vezes é desejável excluir um os acessadores. Você pode omitir o acessador set para tornar a propriedade somente leitura:

public string Name
{
    get
    {
        return _name;
    }
    private set
    {
        _name = value;
    }
}

Como alternativa, é possível expor um acessador publicamente, porém, tornando o outro privado ou protegido. Para obter mais informações, consulte Acessibilidade do Acessador Assimétrico.

Depois de serem declaradas, as propriedades podem ser usadas como campos da classe. As propriedades permitem uma sintaxe natural na obtenção e configuração do valor de uma propriedade, conforme as instruções a seguir:

person.Name = "Joe";
person.Age = 99;

Em um método de propriedade set, uma variável especial value está disponível. Essa variável contém o valor que o usuário especificou, por exemplo:

_name = value;

Observe a sintaxe normal para incrementar a propriedade Age em um objeto Person:

person.Age += 1;

Se métodos set e get separados fossem usados para modelar propriedades, o código equivalente se pareceria com isto:

person.SetAge(person.GetAge() + 1);

O método ToString é substituído neste exemplo:

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

Observe que ToString não é usado explicitamente no programa. Ele é invocado por padrão pelas chamadas WriteLine.

Confira também