Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Auto-Implemented Properties

Olá! Gostaria de entender melhor o funcionamento das Properties que não são "Auto-Implemented Properties".

No código abaixo:

class Cliente
{
    private string cpf;
    public string Cpf {
        get
        {
            return cpf;
        }
        set
        {
            this.cpf = value;
        }
    }
}

O atributo cpf é privado, mas o getter e setter fazem parte de um método público. Como que funciona essa implementação ?

5 respostas

Olá Thiago,

como o cpf é um atributo privado, o usuário não consegue acessar diretamente o atributo de fora da classe. O que vai acontecer agora é que do lado de fora, parece que estarei invocando um atributo, quando na verdade vou chamar o getter ou o setter. Por exemplo, se eu fizer:

Cliente thiago = new Cliente();
thiago.Cpf = "000.000.000-00";

parece que o código está invocando o atributo cpf, porém na verdade ele está chamando o set da propriedade Cpf, que é público:

set
{
            this.cpf = value;
}

O comando value nada mais é para recuperar o valor atribuído, que neste caso é o "000.000.000-00". O mesmo vale se eu fizer:

Cliente thiago = new Cliente();
MessageBox.Show(thiago.Cpf);

estarei chamando o get da propriedade Cpf.

Até para você fazer um teste, altere o set da propriedade para ela ficar assim:

class Cliente
{
    private string cpf;
    public string Cpf {
        get
        {
            return cpf;
        }
        set
        {
            this.cpf = "cpf do cliente: " + value;
        }
    }
}

E no formulário, faça em algum ponto o seguinte código:

Cliente thiago = new Cliente();
thiago.Cpf = "000.000.000-00";
MessageBox.Show(thiago.Cpf);

Você verá que ele vai imprimir "cpf do cliente: 000.000.000-00".

Olá Lucas, obrigado pelo esclarecimento!

Uma outra dúvida, como deveríamos proceder se quiséssemos que o setter fosse privado, sem usar o "Auto-Implemented Properties"? Digo isso pois o nosso método do Getter & Setter está classificada como public

Olá Thaigo,

neste caso é só tirar a definição do setter, ficaria assim:

class Cliente
{
    private string cpf;
    public string Cpf {
        get
        {
            return cpf;
        }
    }
}

Desta forma as outras classes apenas poderão pegar a informação com o getter da propriedade, mas nunca atribuir uma informação. Apenas a própria classe Cliente terá acesso ao atributo cpf.

Olá Lucas! Obrigado pela resposta.

Seria possível criar um método Setter privado ? Ou seja, um método que fizesse mais do que simplesmente alterar o cpf, mas que não fosse public ?

solução!

Neste caso você pode redefinir o modificador de acesso do setter para private assim

public string Cpf {
    get
    {
        return cpf;
    }
    private set {
            //Lógica complexa do setter
    }
}