Chega de Boilerplate: Simplificando seu código C# com Records
Se você já programa em C# há algum tempo, com certeza já teve que criar uma classe apenas para transportar dados (os famosos DTOs ou POCOs). O cenário é sempre o mesmo: criar a classe, definir as propriedades, gerar o construtor, herdar de IEquatable, sobrescrever Equals, GetHashCode e o ToString.
Resultado? Um arquivo de 50 linhas para algo que deveria ser simples.
Felizmente, o C# introduziu os Records (Registros). Eles foram desenhados especificamente para cenários onde o foco são os dados, e não o comportamento.
O que é um Record?
Um Record é uma construção que funciona de forma muito semelhante a uma classe, mas com superpoderes nativos voltados para a imutabilidade e comparação por valor.
Veja a diferença gritante na sintaxe. O código abaixo faz exatamente a mesma coisa:
Abordagem Tradicional (Classe)
public class Desenvolvedor
{
public string Nome { get; }
public string Senioridade { get; }
public Desenvolvedor(string nome, string senioridade)
{
Nome = nome;
Senioridade = senioridade;
}
// E aqui ainda faltaria sobrescrever Equals, GetHashCode, etc...
}
Abordagem Moderna (Record)
public record Desenvolvedor(string Nome, string Senioridade);
Sim, apenas uma linha. O compilador do C# faz todo o trabalho pesado por trás dos panos para você.
Por que você deveria usar Records hoje mesmo?
1. Imutabilidade por Padrão
Ao usar a sintaxe simplificada (Positional Records), as propriedades são criadas como init-only. Isso significa que os dados só podem ser definidos no momento da criação do objeto. Tentar alterá-los depois causará um erro de compilação. Isso previne bugs bizarros de efeitos colaterais no seu código.
2. Comparação por Valor
Em classes normais, se você comparar dois objetos diferentes com os mesmos dados, o C# dirá que eles são diferentes porque eles apontam para lugares diferentes na memória. Com Records, a comparação é feita com base nos valores das propriedades.
var dev1 = new Desenvolvedor("Alex", "Pleno");
var dev2 = new Desenvolvedor("Alex", "Pleno");
Console.WriteLine(dev1 == dev2); // Retorna TRUE!
3. Mutação não-destrutiva com a expressão with
E se você precisar alterar apenas uma propriedade de um objeto imutável? Em vez de modificar o objeto original, você cria uma cópia modificada usando a palavra-chave with:
var devJunior = new Desenvolvedor("Lucas", "Junior");
// Criando uma cópia, mas alterando apenas a senioridade
var devPleno = devJunior with { Senioridade = "Pleno" };
Conclusão
Os Records não vieram para substituir as classes tradicionais, mas são a ferramenta perfeita para quando você precisa modelar dados que não devem mudar, como respostas de APIs, payloads de eventos ou DTOs.
Adotar Records deixa seu projeto .NET mais limpo, legível e robusto contra bugs de estado.