Records fornecem igualdade por valor, with para mutacao nao-destrutiva e Deconstruct automatico que habilita pattern matching posicional. Juntos, eliminam toneladas de boilerplate e tornam o codigo mais seguro.

O que sao Records?

record e um tipo por referencia com igualdade por valor e suporte nativo a mutacao nao-destrutiva via with. Usado como data carrier imutavel. Suporta heranca como classes.

record struct e um tipo por valor com as mesmas vantagens. Use quando quiser semantica de valor e layout stack-friendly. Adicione readonly para impedir mutacao dos campos.

record class vs record struct

Aspectorecord (class)record structreadonly record struct
TipoReferencia (heap)Valor (stack)Valor (stack)
IgualdadePor valorPor valorPor valor
HerancaSimNaoNao
Imutavel por padraoPositional simNaoSim
withSimSimSim
Quando usarDomain models, DTOsPequenos value objectsChaves de dicionario, IDs

Sintaxe posicional β€” igualdade por valor

public record Person(string First, string Last); var a = new Person("Ada", "Lovelace"); var b = new Person("Ada", "Lovelace"); Console.WriteLine(a == b); // True (value-based) var c = a with { Last = "Byron" }; // non-destructive mutation Console.WriteLine(a); // Person { First = Ada, Last = Lovelace } Console.WriteLine(c); // Person { First = Ada, Last = Byron }

O compilador sintetiza Equals, GetHashCode, Deconstruct e um ToString legivel. A expressao with copia a, alterando apenas uma propriedade.

Sintaxe nominal β€” init-only properties

public record Product { public string Sku { get; init; } = ""; public decimal Price { get; init; } } var p1 = new Product { Sku = "X-1", Price = 3.5m }; var p2 = p1 with { Price = 4.0m };

Nao precisa usar parametros posicionais; init-only setters mantem o objeto efetivamente imutavel apos a construcao.

record struct e readonly record struct

public readonly record struct Point(int X, int Y); var p = new Point(2, 3); var p2 = p with { X = 5 }; // copy with change Console.WriteLine(p.Equals(p2)); // False

Um record struct e um tipo por valor. Adicionar readonly impede a mutacao dos campos e habilita defensive copy.

Por que usar record em vez de class com Equals override?
Records sintetizam Equals, GetHashCode, Deconstruct e ToString automaticamente. Voce ganha igualdade por valor, pattern matching posicional e with sem escrever boilerplate. Menos codigo, menos bugs.