Records e imutabilidade
Resumo
recordcria tipos focados em dados com igualdade por valor, imutabilidade fácil (init) e cópia comwith. São ideais para DTOs e objetos de valor — exatamente o que uma Web API troca com o cliente.
1. Objetivos de Aprendizagem#
- Declarar records posicionais e nominais.
- Entender igualdade por valor e imutabilidade.
- Copiar com alteração via
with.
2. Pré-requisitos#
- Classes e propriedades (tópico 5.1).
3. Conceito#
Um record é um tipo (por padrão de referência) otimizado para dados. Diferenças-chave em relação a uma class comum:
- Igualdade por valor: dois records com os mesmos dados são iguais (
==compara conteúdo, não referência). - Imutabilidade: com propriedades
init, o objeto não muda após criado. with: cria uma cópia alterando só o que você indicar (não-destrutivo).ToString()já formatado com os valores.
O porquê: DTOs e objetos de valor devem ser imutáveis e comparáveis por conteúdo. Records dão isso com uma linha.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Records
cd Catalog.Records
4.2. Implementação Passo a Passo#
- Record posicional (conciso):
public record ProdutoDto(Guid Id, string Nome, decimal Preco);
- Igualdade por valor e
with:
var a = new ProdutoDto(Guid.Empty, "Mouse", 90m);
var b = a with { Preco = 80m }; // cópia com preço alterado
Console.WriteLine(a == b); // False (preços diferentes)
Console.WriteLine(a); // ProdutoDto { Id = ..., Nome = Mouse, Preco = 90 }
- Record nominal (com
init):
public record CategoriaDto
{
public Guid Id { get; init; }
public string Nome { get; init; } = "";
}
4.3. Executando#
dotnet run
5. Exemplo Completo#
ProdutoDto como record posicional é imutável, comparável por valor e legível — o formato ideal para o corpo de respostas/requisições de uma API.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Usar records para DTOs e objetos de valor | Usar records para entidades com identidade mutável e ciclo de vida |
Preferir init para imutabilidade | Adicionar set mutável e perder as garantias |
Criar variações com with | Mutar o objeto original |
Atenção
record classé referência; existe tambémrecord struct(valor). A igualdade por valor de records vale para os membros — coleções dentro do record ainda comparam por referência.
7. Segurança e Produção#
- DTOs imutáveis evitam mutações acidentais de dados que trafegam pela API — menos efeitos colaterais surpreendentes.
8. Exercícios#
- Fácil: crie um record
EnderecoDtoposicional. - Médio: use
withpara gerar uma cópia com um campo alterado. - Desafio: compare dois records iguais e explique por que
==retornatrue.
9. Resumo#
record oferece igualdade por valor, imutabilidade (init) e cópia com with. É o tipo ideal para DTOs e objetos de valor de uma API.
10. Próximos Passos#
A seguir, pattern matching para simplificar decisões.
11. Referências#
- Microsoft Learn — Records
- Microsoft Learn — Init-only setters
- Microsoft Learn — Expressão with