3
respostas

Não entendi Get e Set

Não é uma dúvida em um trecho específico do código, eu simplesmente não entendi exatamente como eles funcionam '-' alguém me indicaria algum material de apoio, nada muito técnico por favor, desde já agradeço!

3 respostas

Get e Set segue um principio que é o encapsulamento.

p.e

public class Carros
{
    private string modelo; 
}

A classe carros contém um atributo chamado modelo. Mas vamos supor que você queira validar (criar regras de negócios ) para não deixar que atribuem qualquer modelo nesse atributo, então criamos as propriedades.

public class Carros
{
    private string modelo;
    public string Modelo 
    {
        get  {  return this.modelo };
        set 
        {
             if (modelo != "Astra")
                this.modelo = value;
            else
                this.modelo = "GM Astra";
         };
} 

}

Então agora podemos validar os dados antes de atribuir ou consultar.

As propriedade automáticas get;set servem para quando não precisamos escrever regras de validação.

public string Modelo {get;set;};

Oi Luckas!

Imagina a gente definir o numero de uma conta, algo como:

Conta contaLukas = new Conta();
contaLukas.numero = 123;

Isto poderia gerar problemas, como alguém até mesmo de forma desenganada, sem querer, atribuir um valor negativo:

Conta contaLukas = new Conta();
contaLukas.numero = -123;

Será que faz sentido uma conta ter numero negativo? certamente não. Mas não conseguimos fazer validações nos atributos.

Por isto, o comum é criar métodos para fazer este trabalho de validação, e caso o valor esteja dentro do esperado, podemos jogar o valor recebido para o atributo numero.

Além disso, para evitar que alguém ainda acesse o atributo diretamente, é comum deixarmos ele como private, para que só a classe Conta o acesse. Algo como:

class Conta
{
    // outro atributos
    private int numero;

    // saca e deposita

    public void DefineNumero(int numeroRecebido)
    {
        if(numero > 0)
        {
            numero = numeroRecebido;
        }
    }
}

Além disso precisamos ainda ser capazes de exibir o numero, para isso, a solução é cria um método que devolve seu valor:

class Conta
{
    // todo o codigo anterior

    public int DevolveNumero()
    {
        return numero;
    }
}

Agora para acessar e atribuir um valor:

Conta contaLukas = new Conta();
contaLukas.DefineNumero(123);
MessageBox.Show(contaLukas.DevolveNumero());

Em linguagens como Java isso é tão comum que esses métodos possuem um padrão de nomenclatura. São os getters e setters.

Mas agora como temos métodos, perdemos aquela sintaxe anterior onde podemos atribuir um valor diretamente para o atributo. :(


Por esse motivo o C# possui propriedades. Uma forma de você atribuir um valor e recuperar um valor, onde parece que voce está manipulando um atributo, mas na real um bloco de código está sendo executado por trás.

Dentro da classe Conta, para criar a propriedade que manipula o atributo numero, você pode criar com o mesmo nome do atributo, mas com primeira letra em maiúscula. Então abrimos um bloco de código (chaves) e temos algo como:

class Conta
{
    // outros atributos
    private int numero;

    // propiedade    
    public int Numero
    {
        set
        {
            if(value > 0)
            {
                numero = value;
            }
        }

        get
        {
            return numero;
        }
    }
}

Para usar ficaria da seguinte forma:

Conta contaLukas = new Conta();
contaLukas.Numero = 123;
MessageBox.Show(contaLukas.Numero);

Parece que estamos atribuindo um valor direto para o atributo. Mas na real estamos acessando a propriedade. Na linha da atribuição:

contaLukas.Numero = 123;

Será executado o bloco set da propriedade, e o 123 vira o value lá dentro, que é atribuido para o numero caso seja maior que 0.

E quando fazemos:

MessageBox.Show(contaLukas.Numero);

É executado o bloco Get da propriedade, onde estamos apenas devolvendo o valor do atributo;


Muitas vezes nós queremos apenas deixar o atributo privado mas não fazer nenhuma validação extra. Então nosso código ficaria assim:

class Conta
{
    // outros atributos
    private int numero;

    // propiedade    
    public int Numero
    {
        set
        {
            numero = value;
        }

        get
        {
            return numero;
        }
    }
}

Para esses casos padrão, onde apenas atribuímos um valor para o atributo e retornamos o valor do atributo, o C# tem as Auto-Implemented Properties:

class Conta
{
    // outros atributos

    public int Numero { get; set; }
}

O código acima corresponde exatamente ao código anterior. Ele irá criar um atributo por debaixo dos panos, o qual nao temos acesso, mas o resultado é o que fizemos antes: um get que retorna o valor deste atributo oculto, e um set que pega o valor passado e joga para o atributo. Vamos continuar podendo fazer:

Conta contaLukas = new Conta();
contaLukas.Numero = 123;
MessageBox.Show(contaLukas.Numero);

Isso tudo tem a ver com o encapsulamento.


Você pode ver mais sobre isso na apostila aberta de C#.

E também nos guias da Microsoft.

faz sentido? Abraço!

Ops, desculpa. quando submeti a resposta não vi que o Paulo já tinha respondido. :)