C# Tipos Intermediário
Records
Records são tipos especiais em C# que fornecem igualdade por valor, sintaxe concisa para criar objetos imutáveis e o operador with para gerar cópias modificadas. Eles existem tanto como record class (referência) quanto record struct (valor).
A igualdade por valor significa que dois records são iguais se todos os seus campos/propriedades também forem iguais, ao contrário de classes normais que usam igualdade por referência. Isso é útil para representar dados imutáveis, como um ponto, uma pessoa ou uma configuração.
O operador with permite criar uma nova instância a partir de outra, alterando apenas algumas propriedades. Como os records são imutáveis por padrão (propriedades init), isso evita efeitos colaterais indesejados e facilita o raciocínio sobre o código.
Neste card, você verá como declarar, comparar e copiar records, além de entender quando usar record class ou record struct.
Pontos-chave
record classé um tipo de referência com igualdade por valor;record structé um tipo de valor com a mesma semântica.- A igualdade por valor compara automaticamente todas as propriedades públicas de um record.
- O operador
withcria uma cópia do record alterando as propriedades especificadas. - Records incentivam imutabilidade usando propriedades
initou posicionais. - Records posicionais geram automaticamente construtor, propriedades e desconstrução.
using System;
// record class: tipo de referência com igualdade por valor
public record Pessoa(string Nome, int Idade);
// record struct: tipo de valor com igualdade por valor
public record struct Ponto(int X, int Y);
public class Program
{
public static void Main()
{
var p1 = new Pessoa("Ana", 30);
var p2 = new Pessoa("Ana", 30);
var p3 = new Pessoa("Ana", 31);
Console.WriteLine(p1 == p2); // True (igualdade por valor)
Console.WriteLine(p1 == p3); // False
// with: cria cópia modificando apenas a idade
var p4 = p1 with { Idade = 31 };
Console.WriteLine(p4); // Pessoa { Nome = Ana, Idade = 31 }
Console.WriteLine(p1 == p4); // False
// record struct também tem igualdade por valor
var a = new Ponto(1, 2);
var b = new Ponto(1, 2);
Console.WriteLine(a == b); // True
// Desconstrução
var (nome, idade) = p1;
Console.WriteLine($"{nome} tem {idade} anos");
}
}