Médio C#

Conversões e cópia de valor vs referência

Enunciado

Escreva um programa que: (1) declare int a = 5 e int b = a, depois altere b para 10 e mostre os valores; (2) declare um array int[] x = {1,2,3} e int[] y = x, altere y[0] = 99 e mostre x[0]; (3) faça uma conversão implícita de int para double e uma explícita de double para int com cast, mostrando os resultados.

Requisitos

  • Demonstrar que tipos de valor copiam o dado e tipos de referência copiam a referência
  • Usar pelo menos uma conversão implícita e uma explícita
  • Imprimir os valores antes e depois das alterações

Código inicial

using System;

class Program
{
    static void Main()
    {
        // Implemente os três cenários
    }
}

Saída esperada

a=5, b=10
x[0]=99
Conversão implícita: 5 -> 5
Conversão explícita: 5,7 -> 5
Ver dica

Para a conversão explícita, use (int)variavelDouble. Lembre-se de que arrays são tipos de referência.

Mostrar solução
using System;

class Program
{
    static void Main()
    {
        // 1) Tipos de valor: cópia independente
        int a = 5;
        int b = a;   // copia o valor
        b = 10;
        Console.WriteLine($"a={a}, b={b}"); // a=5, b=10

        // 2) Tipos de referência: cópia da referência
        int[] x = { 1, 2, 3 };
        int[] y = x;  // ambas apontam para o mesmo array
        y[0] = 99;
        Console.WriteLine($"x[0]={x[0]}"); // 99

        // 3) Conversões
        int inteiro = 5;
        double real = inteiro; // implícita (int -> double)
        Console.WriteLine($"Conversão implícita: {inteiro} -> {real}");

        double valor = 5.7;
        int truncado = (int)valor; // explícita (double -> int)
        Console.WriteLine($"Conversão explícita: {valor} -> {truncado}");
    }
}

Passo a passo

  1. int a = 5; int b = a; — como int é tipo de valor, b recebe uma cópia do número 5.
  2. b = 10; — altera apenas b; a permanece 5.
  3. int[] x = {1,2,3}; int[] y = x; — arrays são referências; y aponta para o mesmo objeto que x.
  4. y[0] = 99; — modifica o array compartilhado, então x[0] também vira 99.
  5. double real = inteiro; — conversão implícita segura, pois todo int cabe em double.
  6. int truncado = (int)valor; — cast explícito trunca a parte decimal (5.7 vira 5).

Por que funciona

Tipos de valor armazenam o dado diretamente na variável; ao atribuir, o conteúdo é copiado. Tipos de referência armazenam um endereço; ao atribuir, copia-se o endereço, não o objeto. As conversões seguem regras de compatibilidade: implícitas quando não há perda, explícitas quando pode haver perda (e o programador assume a responsabilidade).

Erros comuns

  • Achar que array copia: int[] y = x; não cria um novo array; para copiar, use (int[])x.Clone() ou Array.Copy.
  • Cast sem verificar faixa: (int)1e20 pode gerar resultado indefinido; em contexto checked, lança OverflowException.
  • Confundir conversão com parsing: (int)"5" não compila; para string use int.Parse ou Convert.ToInt32.

Outra forma de resolver

Usar Array.Copy(x, y, x.Length) para copiar o conteúdo do array, evitando o compartilhamento de referência. Preferível quando você precisa de independência entre arrays.

Saída esperada

a=5, b=10
x[0]=99
Conversão implícita: 5 -> 5
Conversão explícita: 5,7 -> 5