Pular para o conteúdo
.NETClasses, propriedades e construtores
Módulo 01Fundamentos da Plataforma e da Linguagem

Classes, propriedades e construtores

intermediario 30 min de leitura·Atualizado · .NET 9
Resumo

Uma classe modela um conceito com dados (propriedades) e comportamento (métodos). Construtores garantem que um objeto nasça em estado válido; propriedades controlam o acesso aos dados.

1. Objetivos de Aprendizagem#

  • Declarar classes com propriedades e construtores.
  • Controlar acesso com modificadores e propriedades auto-implementadas.
  • Aplicar encapsulamento.

2. Pré-requisitos#

  • Value vs reference (Módulo 04).

3. Conceito#

Uma classe é o molde; um objeto é uma instância desse molde. Ela combina:

  • Propriedades: dados com get/set controlados.
  • Construtores: inicializam o objeto em estado válido.
  • Encapsulamento: esconder detalhes internos, expor só o necessário.

O porquê de propriedades (em vez de campos públicos): permitem validação, somente-leitura e evolução sem quebrar quem consome.

3.1. Anatomia de uma propriedade: o que { get; set; } significa#

Uma propriedade não é um dado — é um par de métodos de acesso com cara de campo:

  • o get (acessador de leitura) é chamado quando você (var n = p.Nome;);
  • o set (acessador de escrita) é chamado quando você atribui (p.Nome = "X";), e recebe o novo valor na palavra-chave value.

Escrever public string Nome { get; set; } é uma propriedade auto-implementada: o compilador gera para você um campo de apoio (backing field) oculto e os dois acessadores triviais. É equivalente a escrever à mão:

C#
private string _nome;                 // campo de apoio (gerado automaticamente)
public string Nome
{
    get => _nome;                     // ao ler, devolve o campo
    set => _nome = value;             // ao escrever, guarda 'value' no campo
}

Você só escreve a forma longa quando precisa de lógica no get/set (ex.: validar, normalizar, disparar evento). Enquanto for só ler/gravar, use a forma curta.

Variações que você vai usar o tempo todo:

FormaSignificado
{ get; set; }leitura e escrita públicas
{ get; }só leitura — atribuível apenas no construtor
{ get; private set; }leitura pública, escrita restrita à própria classe
{ get; init; }escrita só na inicialização do objeto (ver aula 6.3)
public decimal Total => Preco * Qtd;propriedade calculada (só get, sem campo)

A propriedade calculada (=>) não guarda valor: ela recomputa a cada leitura. Use-a para valores derivados de outros dados.

4. Mão na Massa#

4.1. Setup#

Shell
dotnet new console -n Catalog.Oop
cd Catalog.Oop

4.2. Implementação Passo a Passo#

  1. Classe com propriedades e construtor:
C#
public class Produto
{
    public Guid Id { get; }              // só leitura (definido no construtor)
    public string Nome { get; set; }
    public decimal Preco { get; private set; } // set restrito à classe

    public Produto(string nome, decimal preco)
    {
        if (string.IsNullOrWhiteSpace(nome))
            throw new ArgumentException("Nome é obrigatório.", nameof(nome));
        Id = Guid.NewGuid();
        Nome = nome;
        Preco = preco;
    }

    public void Reajustar(decimal percentual) =>
        Preco *= (1 + percentual);
}
Nota

nameof(nome) devolve o texto "nome" (o nome do parâmetro) verificado em tempo de compilação. Usar nameof em vez de digitar "nome" faz o valor acompanhar automaticamente uma renomeação (refactor) e evita erros de digitação.

  1. Uso:
C#
var p = new Produto("Teclado", 120m);
p.Reajustar(0.1m);
Console.WriteLine($"{p.Nome}: {p.Preco:C}");

4.3. Executando#

Shell
dotnet run

5. Exemplo Completo#

O Produto acima nasce sempre válido (nome obrigatório, Id gerado) e só permite alterar o preço via método Reajustar — encapsulamento na prática.

6. Boas Práticas e Armadilhas#

FaçaEvite
Validar no construtor para garantir estado válidoCampos públicos mutáveis sem controle
Usar private set/só-leitura quando fizer sentidoExpor set público para tudo
Métodos que representam operações do domínioObjetos anêmicos manipulados por fora
Atenção

propriedade auto-implementada ({ get; set; }) gera um campo de apoio oculto. Só escreva um campo explícito quando precisar de lógica no getter/setter.

7. Segurança e Produção#

  • Encapsular invariantes no construtor/métodos evita estados inválidos que viram bugs difíceis em produção.

8. Exercícios#

  • Fácil: crie uma classe Categoria com Id e Nome.
  • Médio: adicione validação de nome no construtor.
  • Desafio: modele Produto com preço que nunca pode ficar negativo, mesmo após reajuste.

9. Resumo#

Classes combinam propriedades e comportamento; construtores garantem estado válido e propriedades controlam acesso. Encapsule invariantes dentro do objeto.

10. Próximos Passos#

A seguir, reutilização por herança e polimorfismo.

11. Referências#

05-01 — Classes, propriedades e construtores | Curso ASP.NET Core