Médio C#

Usando with para cópias imutáveis

Enunciado

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.

Requisitos

  • Declarar record class Configuracao com Tema e Fonte.
  • Usar with para criar cópias modificando uma propriedade por vez.
  • Imprimir os valores de cada configuração e o resultado das comparações ==.

Código inicial

using System;

// TODO: declarar o record Configuracao

public class Program
{
    public static void Main()
    {
        // TODO: criar configuração padrão e cópias com with
    }
}

Saída esperada

Padrão: Tema=claro, Fonte=12
Cópia 1: Tema=escuro, Fonte=12
Cópia 2: Tema=claro, Fonte=16
Padrão == Cópia 1? False
Padrão == Cópia 2? False
Ver dica

Use var copia1 = padrao with { Tema = "escuro" }; e depois compare com ==.

Mostrar solução
using System;

public record Configuracao(string Tema, int Fonte);

public class Program
{
    public static void Main()
    {
        var padrao = new Configuracao("claro", 12);

        // with cria uma cópia alterando apenas o Tema
        var copia1 = padrao with { Tema = "escuro" };

        // with cria uma cópia alterando apenas a Fonte
        var copia2 = padrao with { Fonte = 16 };

        Console.WriteLine($"Padrão: Tema={padrao.Tema}, Fonte={padrao.Fonte}");
        Console.WriteLine($"Cópia 1: Tema={copia1.Tema}, Fonte={copia1.Fonte}");
        Console.WriteLine($"Cópia 2: Tema={copia2.Tema}, Fonte={copia2.Fonte}");

        Console.WriteLine($"Padrão == Cópia 1? {padrao == copia1}");
        Console.WriteLine($"Padrão == Cópia 2? {padrao == copia2}");
    }
}

Passo a passo

  1. Declaramos Configuracao como record posicional, gerando propriedades Tema e Fonte.
  2. Criamos padrao com tema "claro" e fonte 12.
  3. padrao with { Tema = "escuro" } cria uma nova instância copiando todos os campos, mas substituindo Tema por "escuro".
  4. De forma similar, padrao with { Fonte = 16 } cria outra cópia alterando apenas a fonte.
  5. Exibimos os valores usando interpolação de strings.
  6. Comparamos padrao == copia1 e padrao == copia2; ambas retornam False porque há pelo menos uma propriedade diferente.

Por que funciona

O operador with é traduzido pelo compilador para uma chamada ao construtor de cópia do record, que copia todos os campos e depois aplica as alterações especificadas. Como os records são imutáveis por padrão, essa cópia é segura e não afeta o original. A igualdade por valor garante que as comparações reflitam os dados atuais.

Erros comuns

  • Tentar modificar diretamente: padrao.Tema = "escuro"; gera erro de compilação porque Tema é init.
  • Esquecer de usar with: var copia = padrao; apenas copia a referência, não cria novo objeto.
  • Usar with em um record struct sem atribuir a uma variável: padrao with { Tema = "escuro" }; sozinho não altera nada, pois o resultado é descartado.

Outra forma de resolver

Se o record tiver um construtor personalizado, você pode criar a cópia manualmente:

var copia1 = new Configuracao("escuro", padrao.Fonte);

Mas with é mais conciso e menos propenso a erros.

Saída esperada

Padrão: Tema=claro, Fonte=12
Cópia 1: Tema=escuro, Fonte=12
Cópia 2: Tema=claro, Fonte=16
Padrão == Cópia 1? False
Padrão == Cópia 2? False