Fácil C#

Criando e comparando structs

Enunciado

Crie uma struct chamada Retangulo com campos Largura e Altura (double). No Main, crie dois retângulos, atribua um ao outro, modifique a cópia e imprima ambos para mostrar que são independentes.

Requisitos

  • Definir struct Retangulo com campos públicos Largura e Altura.
  • Criar r1 com (3, 4) e r2 = r1.
  • Modificar r2.Largura para 10.
  • Imprimir r1 e r2 mostrando que r1 permanece (3, 4).

Código inicial

using System;

// Defina a struct Retangulo aqui

class Program
{
    static void Main()
    {
        // Crie r1, r2 e demonstre a cópia
    }
}

Saída esperada

r1 = (3, 4)
r2 = (10, 4)
Ver dica

Structs são tipos de valor: ao atribuir r2 = r1, os campos são copiados. Modificar r2 não altera r1.

Mostrar solução
using System;

// Struct: tipo de valor
public struct Retangulo
{
    public double Largura;
    public double Altura;

    public Retangulo(double largura, double altura)
    {
        Largura = largura;
        Altura = altura;
    }

    public override string ToString() => $"({Largura}, {Altura})";
}

class Program
{
    static void Main()
    {
        Retangulo r1 = new Retangulo(3, 4);
        Retangulo r2 = r1; // cópia independente
        r2.Largura = 10;

        Console.WriteLine($"r1 = {r1}");
        Console.WriteLine($"r2 = {r2}");
    }
}

Passo a passo

  1. Declaramos public struct Retangulo com dois campos double e um construtor que os inicializa.
  2. Sobrescrevemos ToString() para facilitar a impressão no formato (largura, altura).
  3. No Main, criamos r1 com largura 3 e altura 4.
  4. Atribuímos r2 = r1. Como Retangulo é struct, todos os campos são copiados para r2.
  5. Alteramos r2.Largura para 10. Isso modifica apenas a cópia.
  6. Imprimimos ambos: r1 continua com 3, provando a semântica de valor.

Por que funciona

Structs armazenam os dados diretamente na variável. A atribuição r2 = r1 copia bit a bit o conteúdo, criando duas instâncias independentes. Isso é o cerne da semântica de valor: cada variável tem sua própria cópia dos dados.

Erros comuns

  • Esquecer o construtor e tentar usar new Retangulo { Largura = 3, Altura = 4 }: funciona, mas se a struct tiver campos readonly não compila. Prefira sempre o construtor.
  • Declarar a struct como class por engano: a saída seria r1 = (10, 4) e r2 = (10, 4), pois ambos apontariam para o mesmo objeto.
  • Não sobrescrever ToString(): a saída seria o nome do tipo, dificultando a verificação.

Outra forma de resolver

Usar propriedades autoimplementadas em vez de campos públicos:

public struct Retangulo
{
    public double Largura { get; set; }
    public double Altura { get; set; }
    public Retangulo(double l, double a) { Largura = l; Altura = a; }
    public override string ToString() => $"({Largura}, {Altura})";
}

É preferível para encapsulamento, mas a semântica de valor permanece.

Saída esperada

r1 = (3, 4)
r2 = (10, 4)