Propriedades
Em C#, uma Propriedade é um membro de uma classe que fornece um mecanismo flexível e poderoso para ler, escrever ou calcular o valor de um campo privado. Elas são a face pública do estado de um objeto e a principal ferramenta para implementar o pilar do Encapsulamento.
À primeira vista, uma propriedade pode parecer simplesmente uma forma mais verbosa de se declarar uma variável pública, mas essa impressão é enganosa. Na verdade, elas são os guardiões dos dados de um objeto, permitindo controle total sobre como o estado é acessado e modificado.
O Problema: Por que Não Usar Campos Públicos?
Uma pergunta comum para quem está começando é: "Se public string Name { get; set; } funciona de forma parecida com public string Name;, por que toda essa cerimônia?". A resposta está na quebra do encapsulamento.
Um campo público é um convite ao caos. Ele expõe a representação interna do estado do seu objeto sem nenhuma proteção. Qualquer parte do seu sistema pode modificar esse campo para qualquer valor, a qualquer momento, incluindo valores inválidos.
Se você usa um campo público e, meses depois, percebe que precisa adicionar uma validação (o preço não pode ser negativo), você terá um problema gigantesco. Você precisará encontrar todos os lugares no seu código que modificam myProduct.price e adicionar a lógica de validação ali. Isso é frágil, propenso a erros e insustentável. Com uma propriedade, a mudança é feita em um único lugar: dentro da classe Product.
A Anatomia de uma Propriedade
Uma propriedade é, na verdade, "açúcar sintático" (uma forma mais bonita de escrever) para um par de métodos chamados acessadores (accessors).
Campo de Apoio (Backing Field): Geralmente, uma propriedade envolve um campo
privateque armazena o dado real. A convenção é nomeá-lo com um underscore (_) no início (ex:_name).Acessador
get: Este bloco de código é executado quando o valor da propriedade é lido. Ele deve retornar um valor do tipo da propriedade.Acessador
set: Este bloco de código é executado quando um valor é atribuído à propriedade. Dentro do blocoset, você tem acesso a uma palavra-chave implícita chamadavalue, que contém o valor que está sendo atribuído. É aqui que a mágica da validação e do controle acontece.
Diagrama Conceitual
Este diagrama ilustra como a propriedade atua como um intermediário ou guardião para o campo privado.
Tipos de Propriedades em C#
C# oferece várias sintaxes para declarar propriedades, cada uma adequada a um cenário diferente.
1. Propriedades Automáticas (Auto-Implemented Properties)
Esta é a forma mais comum e concisa. Você a utiliza quando não precisa de nenhuma lógica customizada nos acessadores.
public string Name { get; set; }
Ao usar esta sintaxe, o compilador do C# cria um backing field anônimo e privado para você nos bastidores. Você obtém todos os benefícios de uma propriedade (flexibilidade futura) com a clareza de um campo.
2. Propriedades Completas (Fully-Implemented Properties)
Você usa esta forma quando precisa de um backing field explícito para implementar uma lógica customizada.
3. Propriedades de Apenas Leitura (Read-Only Properties)
Frequentemente, você quer expor um dado que não pode ser modificado de fora da classe. Existem duas maneiras principais:
Propriedade Computada: Não tem um backing field e seu valor é calculado no
get. Ela não possui um acessadorset.public string Description => $"{Name} is {Age} years old.";Propriedade com
private set: O valor pode ser lido por todos, mas só pode ser modificado de dentro da própria classe (geralmente no construtor). Isso é perfeito para IDs ou datas de criação.public Guid Id { get; private set; }
Exemplo Prático: UserProfile
Este exemplo combina os diferentes tipos de propriedades em uma classe do mundo real.