Fácil C#
Criando e comparando records
Enunciado
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.
Requisitos
- Declarar
record class Produtocom propriedadesNomeePreco. - Criar duas instâncias com os mesmos valores e uma com valor diferente.
- Imprimir
TrueouFalsepara as comparações==.
Código inicial
using System;
// TODO: declarar o record Produto
public class Program
{
public static void Main()
{
// TODO: criar instâncias e comparar
}
}
Saída esperada
True
False
Ver dica
Use a sintaxe posicional: public record Produto(string Nome, decimal Preco);.
Mostrar solução
using System;
// Record posicional: gera construtor, propriedades e igualdade por valor
public record Produto(string Nome, decimal Preco);
public class Program
{
public static void Main()
{
var p1 = new Produto("Caneta", 2.50m);
var p2 = new Produto("Caneta", 2.50m);
var p3 = new Produto("Lápis", 1.20m);
Console.WriteLine(p1 == p2); // True: mesmos valores
Console.WriteLine(p1 == p3); // False: valores diferentes
}
}
Passo a passo
- Declaramos
Produtocomorecord classposicional: isso cria automaticamente um construtor que recebeNomeePrecoe propriedades públicas somente leitura. - No
Main, criamosp1ep2com os mesmos argumentos, ep3com valores diferentes. - A comparação
p1 == p2usa a igualdade por valor gerada pelo compilador para records, que compara todos os campos. p1 == p3retornafalseporque os valores deNomeePrecodiferem.Console.WriteLineexibeTrueeFalse.
Por que funciona
Records implementam IEquatable<T> e sobrescrevem Equals e GetHashCode para comparar todos os campos públicos. Assim, dois records com os mesmos dados são considerados iguais, independentemente de serem objetos diferentes na memória.
Erros comuns
- Esquecer o
mno literal decimal:2.50édoublee causa erro de compilação ao passar paradecimal. Use2.50m. - Tentar modificar uma propriedade após a criação:
p1.Nome = "Outro";gera erro de compilação porque as propriedades de records posicionais sãoinit. - Usar
classem vez derecord: a comparação==seria por referência e imprimiriaFalseparap1 == p2.
Outra forma de resolver
Se precisar de mais controle, declare o record com corpo e propriedades manuais:
public record Produto
{
public string Nome { get; init; }
public decimal Preco { get; init; }
}
Mas a forma posicional é mais concisa e idiomática.
Saída esperada
True
False