Propriedades em C#: get e set para proteger a vida do personagem
- Gerar link
- X
- Outros aplicativos

Resumo rápido
- Propriedade parece um campo por fora, mas por dentro tem código que controla a leitura e a escrita.
getroda quando alguém lê o valor;setroda quando alguém muda.- Dentro do
set,valueé o valor que tentaram colocar. - Propriedade automática (
{ get; set; }) é o atalho quando não há regra. private setdeixa ler de fora, mas só a própria classe muda.
No post de classes e objetos, o personagem tinha um campo public int Vida. Funciona, mas qualquer parte do código pode fazer isto:

C#
Personagem leon = new Personagem();
leon.Vida = -500; // nada impede
leon.Balas = 9999; // nem isso
Console.WriteLine($"Vida: {leon.Vida} | Balas: {leon.Balas}");
class Personagem
{
public int Vida = 100;
public int Balas = 6;
}
Saída esperada
Vida: -500 | Balas: 9999
Vida negativa e munição infinita: um bug esperando para acontecer. As propriedades colocam um porteiro na frente do dado, que confere tudo o que entra e sai.
get e set: o porteiro do dado

Uma propriedade tem um campo private guardando o valor de verdade e dois blocos que controlam o acesso:
C#
Personagem leon = new Personagem();
leon.Vida = 150;
Console.WriteLine($"Tentou 150, ficou {leon.Vida}");
leon.Vida = -30;
Console.WriteLine($"Tentou -30, ficou {leon.Vida}");
class Personagem
{
private int vida = 100; // o dado de verdade, escondido
public int Vida // a porta de entrada
{
get { return vida; }
set
{
if (value > 100) vida = 100;
else if (value < 0) vida = 0;
else vida = value;
}
}
}
Saída esperada
Tentou 150, ficou 100
Tentou -30, ficou 0
| Parte | Quando roda | No exemplo |
|---|---|---|
get | quando alguém lê: leon.Vida | devolve o campo vida |
set | quando alguém escreve: leon.Vida = 150 | confere e guarda |
value | dentro do set | o valor que tentaram colocar (150) |
campo private | nunca é acessado de fora | vida, com v minúsculo |
Por fora, leon.Vida continua parecendo um campo comum. Quem usa a classe nem percebe a regra, mas ela nunca deixa a vida sair de 0 a 100.
Propriedade automática
Quando não existe regra nenhuma, escrever campo + get + set é trabalho à toa. A propriedade automática faz tudo em uma linha; o C# cria o campo escondido sozinho:

C#
Personagem jill = new Personagem();
jill.Nome = "Jill";
jill.Classe = "Sobrevivente";
Console.WriteLine($"{jill.Nome}, {jill.Classe}");
class Personagem
{
public string Nome { get; set; } = "";
public string Classe { get; set; } = "Civil";
}
Saída esperada
Jill, Sobrevivente
O = "" e o = "Civil" no fim são valores iniciais. É o jeito mais comum de escrever dados de uma classe em C#: se depois aparecer uma regra, você troca a automática pela completa e quem usa a classe não precisa mudar nada.
private set: todo mundo lê, só a classe muda
A munição não deve ser alterada direto de fora. Ela só muda quando o personagem atira ou recarrega. O private set faz exatamente isso:
C#
Personagem leon = new Personagem();
leon.Atirar();
leon.Atirar();
Console.WriteLine($"Balas: {leon.Balas}");
leon.Recarregar();
Console.WriteLine($"Depois de recarregar: {leon.Balas}");
class Personagem
{
public int Balas { get; private set; } = 6;
public void Atirar()
{
if (Balas > 0) Balas--;
}
public void Recarregar()
{
Balas = 6;
}
}
Saída esperada
Balas: 4
Depois de recarregar: 6
De fora, leon.Balas = 9999; agora dá erro de compilação. A única forma de mudar as balas é pelas ações do próprio personagem.
Propriedade calculada (só get)
Algumas propriedades não guardam nada: calculam o valor na hora a partir de outros dados. Elas só têm get, e o atalho => deixa tudo numa linha:
C#
Personagem claire = new Personagem { Vida = 25 };
Console.WriteLine($"Ferida? {claire.EstaFerida}");
Console.WriteLine(claire.BarraDeVida);
class Personagem
{
public int Vida { get; set; } = 100;
public bool EstaFerida => Vida < 50;
public string BarraDeVida => "[" + new string('#', Vida / 10) + new string('.', 10 - Vida / 10) + "]";
}
Saída esperada
Ferida? True
[##........]
O new Personagem { Vida = 25 } é um inicializador de objeto: cria o objeto e já preenche as propriedades públicas, sem precisar de construtor.
Quando usar cada tipo
| Você precisa | Use |
|---|---|
| Guardar um dado sem regra | public int X { get; set; } |
| Validar o valor que entra | propriedade completa com campo private e set com regra |
| Deixar ler, mas mudar só por métodos da classe | { get; private set; } |
| Valor definido só na criação | { get; init; } ou { get; } preenchido no construtor |
| Valor calculado a partir de outros | public bool X => ...; |
Erros comuns
1. A propriedade chamando a si mesma. Este é o clássico que trava o programa:
C#
public int Vida
{
get { return Vida; } // chama o get de novo, para sempre
set { Vida = value; } // StackOverflowException
}
O get e o set precisam usar o campo (vida, minúsculo), nunca a própria propriedade.
2. Campo público "porque é mais rápido". Comece com propriedade automática. O custo é zero e você pode colocar regra depois sem quebrar quem usa a classe.
3. Esquecer o value. Um set { vida = 100; } ignora o que tentaram colocar. Use value para pegar o valor novo.
DESAFIO
Tente resolver antes de abrir a resposta. Sobreviveu? Vá para o próximo.
Escreva uma propriedade
Fomecom campo privado que nunca passe de 10 nem fique abaixo de 0.Ver resposta
private int fome; public int Fome { get { return fome; } set { fome = Math.Clamp(value, 0, 10); } }. OMath.Clampprende o valor entre o mínimo e o máximo.Com
public int Ervas { get; private set; }, a linhajogador.Ervas = 5;fora da classe compila?Ver resposta
Não. O
seté privado: só métodos da própria classe podem mudarErvas.Crie uma propriedade calculada
PodeCorrerque étruequando a vida é maior que 30.Ver resposta
public bool PodeCorrer => Vida > 30;
Conclusão
Com propriedades, o seu personagem se protege sozinho: a vida não fica negativa, a munição não aparece do nada e quem usa a classe nem precisa saber das regras. Isso é encapsulamento, um dos pilares da orientação a objetos.
Você já viu public e private várias vezes por aqui. No próximo post eles ganham a explicação completa.
📖 Continue a série: Modificadores de acesso em C#.
- Gerar link
- X
- Outros aplicativos
Comentários
Postar um comentário