Pular para o conteúdo
.NETRecords e imutabilidade
Módulo 01Fundamentos da Plataforma e da Linguagem

Records e imutabilidade

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

record cria tipos focados em dados com igualdade por valor, imutabilidade fácil (init) e cópia com with. 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#

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

4.2. Implementação Passo a Passo#

  1. Record posicional (conciso):
C#
public record ProdutoDto(Guid Id, string Nome, decimal Preco);
  1. Igualdade por valor e with:
C#
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 }
  1. Record nominal (com init):
C#
public record CategoriaDto
{
    public Guid Id { get; init; }
    public string Nome { get; init; } = "";
}

4.3. Executando#

Shell
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çaEvite
Usar records para DTOs e objetos de valorUsar records para entidades com identidade mutável e ciclo de vida
Preferir init para imutabilidadeAdicionar set mutável e perder as garantias
Criar variações com withMutar o objeto original
Atenção

record class é referência; existe também record 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 EnderecoDto posicional.
  • Médio: use with para gerar uma cópia com um campo alterado.
  • Desafio: compare dois records iguais e explique por que == retorna true.

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#

06-01 — Records e imutabilidade | Curso ASP.NET Core