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 Produto com propriedades Nome e Preco.
  • Criar duas instâncias com os mesmos valores e uma com valor diferente.
  • Imprimir True ou False para 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

  1. Declaramos Produto como record class posicional: isso cria automaticamente um construtor que recebe Nome e Preco e propriedades públicas somente leitura.
  2. No Main, criamos p1 e p2 com os mesmos argumentos, e p3 com valores diferentes.
  3. A comparação p1 == p2 usa a igualdade por valor gerada pelo compilador para records, que compara todos os campos.
  4. p1 == p3 retorna false porque os valores de Nome e Preco diferem.
  5. Console.WriteLine exibe True e False.

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 m no literal decimal: 2.50 é double e causa erro de compilação ao passar para decimal. Use 2.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ão init.
  • Usar class em vez de record: a comparação == seria por referência e imprimiria False para p1 == 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