Structs: semântica de valor e padrão de imutabilidade
Entenda a semântica de valor das structs no C# 6 e crie um padrão de struct imutável (cópia ao alterar).
Structs: semântica de valor e padrão de imutabilidade é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Visão geral das estruturas
Objetivo: usar estruturas com segurança.
- Semântica de valor (cópia na atribuição)
- Padrão de estrutura imutável em C# 6
- Passagem por valor versus por ref
- Observação sobre encaixotamento
Semântica de cópia
As estruturas são tipos de valor: a atribuição cria uma cópia. Alterar a cópia não altera o original.
using System;
// Simple struct with public fields for demo (okay for small POD data)
public struct Point
{
public int X;
public int Y;
}
public class Program
{
public static void Main(string[] args)
{
Point a = new Point();
a.X = 1; a.Y = 2;
Point b = a; // copy the value
b.X = 9; // change the copy
Console.WriteLine("a=(" + a.X + "," + a.Y + ")");
Console.WriteLine("b=(" + b.X + "," + b.Y + ")"); // different from a
}
}
Padrão de estrutura imutável
Prefira estruturas imutáveis: fields readonly, um construtor para o estado necessário e pequenos auxiliares With para criar novos valores.
using System;
// Immutable struct pattern (C# 6): readonly fields + constructor + With method
public struct Money
{
private readonly decimal _amount;
private readonly string _currency;
public decimal Amount { get { return _amount; } }
public string Currency { get { return _currency; } }
public Money(decimal amount, string currency)
{
_amount = amount;
_currency = currency ?? "USD";
}
// Copy-on-change: returns a new value with updated amount
public Money WithAmount(decimal amount)
{
return new Money(amount, _currency);
}
}
public class Program
{
public static void Main(string[] args)
{
Money m1 = new Money(10m, "USD");
Money m2 = m1.WithAmount(15m); // new value
Console.WriteLine("m1: " + m1.Amount + " " + m1.Currency);
Console.WriteLine("m2: " + m2.Amount + " " + m2.Currency);
}
}
Por valor versus por ref
Os métodos recebem uma cópia por padrão. Use ref para modificar a estrutura de quem fez a chamada.
using System;
public struct Counter
{
public int Value;
}
public class Program
{
static void IncrementByValue(Counter c)
{
c.Value = c.Value + 1; // changes only the local copy
}
static void IncrementByRef(ref Counter c)
{
c.Value = c.Value + 1; // changes the caller's variable
}
public static void Main(string[] args)
{
Counter a = new Counter();
IncrementByValue(a);
Console.WriteLine("After by-value: " + a.Value); // 0
IncrementByRef(ref a);
Console.WriteLine("After by-ref: " + a.Value); // 1
}
}
Fundamentos do encaixotamento
O encaixotamento copia uma estrutura para uma reference de objeto ou interface. O desencaixotamento cria outra cópia.
using System;
public interface IShow { string Show(); }
public struct Temperature : IShow
{
public int C;
public string Show() { return C + "C"; }
}
public class Program
{
public static void Main(string[] args)
{
Temperature t = new Temperature();
t.C = 25;
object boxed = t; // boxing: copy into object
Temperature copy = (Temperature)boxed; // unbox (another copy)
copy.C = 30;
Console.WriteLine("t = " + t.C); // 25
Console.WriteLine("copy = " + copy.C); // 30
}
}
Dicas sobre estruturas
Dicas:
- Use estruturas para pequenos objetos de valor imutáveis (coordenadas, dinheiro).
- Evite estruturas grandes ou muito mutáveis.
- Lembre-se das cópias feitas na atribuição e na passagem por valor.
- Tenha cuidado com o encaixotamento ao converter para objeto ou interface.
Semântica de valor das estruturas
Recapitulação
Recapitulação: as estruturas são tipos de valor. Prefira projetos pequenos e imutáveis (construtor + fields readonly + With). Saiba como a passagem por valor versus por ref e o encaixotamento afetam as cópias.
Perguntas Frequentes
A aula “Structs: semântica de valor e padrão de imutabilidade” é grátis?
Sim — o texto completo de “Structs: semântica de valor e padrão de imutabilidade” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “Structs: semântica de valor e padrão de imutabilidade”?
Entenda a semântica de valor das structs no C# 6 e crie um padrão de struct imutável (cópia ao alterar). Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 3.
Quanto tempo leva a aula “Structs: semântica de valor e padrão de imutabilidade”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Structs: semântica de valor e padrão de imutabilidade
- Tipos semelhantes a registros e igualdade baseada em valor (padrão)
- Enumerações e [Flags]