Da trilha de C# Este conceito ainda não saiu como card do dia. ir para o card de hoje

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 with cria uma cópia do record alterando as propriedades especificadas.
  • Records incentivam imutabilidade usando propriedades init ou posicionais.
  • Records posicionais geram automaticamente construtor, propriedades e desconstrução.
RecordsDemo.cs
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");
    }
}

Exercícios

  1. 1
    Fácil

    Criando e comparando records

    Crie um record class chamado Produto com as propriedades Nome (string) e Preco (decimal). No método Main, instancie dois produtos iguais e um diferente, e exiba o resultado da comparação de igualdade entre eles.

    Resolver
  2. 2
    Médio

    Usando with para cópias imutáveis

    Crie um record class Configuracao com as propriedades Tema (string) e Fonte (int). Crie uma configuração padrão, gere uma cópia alterando apenas o tema para "escuro" e outra cópia alterando apenas a fonte para 16. Exiba os valores e compare as igualdades.

    Resolver
  3. 3
    Desafio

    Record struct e igualdade por valor

    Crie um record struct Coordenada com as propriedades X e Y (int). No Main, crie duas coordenadas iguais e uma diferente. Use with para criar uma cópia alterando X. Exiba a igualdade entre as coordenadas e também entre a cópia e a original. Além disso, mostre que record struct é um tipo de valor usando Equals e ReferenceEquals.

    Resolver

Continue estudando