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 Retangulocom campos públicosLarguraeAltura. - Criar
r1com (3, 4) er2 = r1. - Modificar
r2.Largurapara 10. - Imprimir
r1er2mostrando quer1permanece (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
- Declaramos
public struct Retangulocom dois camposdoublee um construtor que os inicializa. - Sobrescrevemos
ToString()para facilitar a impressão no formato(largura, altura). - No
Main, criamosr1com largura 3 e altura 4. - Atribuímos
r2 = r1. ComoRetanguloé struct, todos os campos são copiados parar2. - Alteramos
r2.Largurapara 10. Isso modifica apenas a cópia. - Imprimimos ambos:
r1continua 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 camposreadonlynão compila. Prefira sempre o construtor. - Declarar a struct como
classpor engano: a saída seriar1 = (10, 4)er2 = (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)