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 ConfiguracaocomTemaeFonte. - Usar
withpara 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
- Declaramos
Configuracaocomo record posicional, gerando propriedadesTemaeFonte. - Criamos
padraocom tema "claro" e fonte 12. padrao with { Tema = "escuro" }cria uma nova instância copiando todos os campos, mas substituindoTemapor "escuro".- De forma similar,
padrao with { Fonte = 16 }cria outra cópia alterando apenas a fonte. - Exibimos os valores usando interpolação de strings.
- Comparamos
padrao == copia1epadrao == copia2; ambas retornamFalseporque 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 porqueTemaéinit. - Esquecer de usar
with:var copia = padrao;apenas copia a referência, não cria novo objeto. - Usar
withem umrecord structsem 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