0Pricing
C# Academy · Aula

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

Verificação rápida: o que melhor descreve a semântica de valor de uma estrutura em C#?

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

  1. Structs: semântica de valor e padrão de imutabilidade
  2. Tipos semelhantes a registros e igualdade baseada em valor (padrão)
  3. Enumerações e [Flags]
← Voltar para C# Academy