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
int a = 5; int b = a;— comointé tipo de valor,brecebe uma cópia do número 5.b = 10;— altera apenasb;apermanece 5.int[] x = {1,2,3}; int[] y = x;— arrays são referências;yaponta para o mesmo objeto quex.y[0] = 99;— modifica o array compartilhado, entãox[0]também vira 99.double real = inteiro;— conversão implícita segura, pois todointcabe emdouble.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()ouArray.Copy. - Cast sem verificar faixa:
(int)1e20pode gerar resultado indefinido; em contextochecked, lançaOverflowException. - Confundir conversão com parsing:
(int)"5"não compila; para string useint.ParseouConvert.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