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!
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!
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. :)