Struct vs class
Resumo
classé tipo de referência (a variável guarda um "endereço");structé tipo de valor (a variável guarda o dado em si). Isso muda como cópia, igualdade e passagem para métodos se comportam.
1. Objetivos de Aprendizagem#
- Diferenciar tipo de valor de tipo de referência.
- Prever o comportamento de cópia e atribuição.
- Escolher entre
structeclass.
2. Pré-requisitos#
- Métodos e parâmetros (tópico 3.3).
3. Conceito#
- Tipo de referência (
class): a variável contém uma referência ao objeto. Copiar a variável copia a referência — dois nomes apontam para o mesmo objeto. - Tipo de valor (
struct): a variável contém o dado. Copiar cria uma cópia independente.
O porquê de existir struct: dados pequenos e imutáveis (um ponto, uma cor, um valor monetário) ficam mais eficientes como valor, sem alocação no heap.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.ValueRef
cd Catalog.ValueRef
4.2. Implementação Passo a Passo#
- Comportamento de referência (class):
class Produto { public string Nome = ""; }
var a = new Produto { Nome = "Mouse" };
var b = a; // mesma referência
b.Nome = "Teclado";
Console.WriteLine(a.Nome); // "Teclado" — mudou nos dois
- Comportamento de valor (struct):
struct Dinheiro { public decimal Valor; }
var x = new Dinheiro { Valor = 10 };
var y = x; // cópia independente
y.Valor = 99;
Console.WriteLine(x.Valor); // 10 — inalterado
4.3. Executando#
dotnet run
5. Exemplo Completo#
O mesmo trecho acima demonstra a diferença central: alterar b (class) afeta a; alterar y (struct) não afeta x.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
Usar class para entidades com identidade e ciclo de vida | struct grande e mutável (cópias caras e bugs) |
Usar struct (idealmente readonly) para valores pequenos | Assumir que atribuir uma class "clona" o objeto |
Atençãoa maioria das suas entidades de negócio será
class. Só considerestructpara tipos pequenos, imutáveis e sem identidade própria.
7. Segurança e Produção#
- Compartilhar referências mutáveis entre threads sem sincronização causa race conditions. Imutabilidade reduz esse risco.
8. Exercícios#
- Fácil: reproduza os dois exemplos e explique a saída.
- Médio: transforme
Dinheiroemreadonly struct. - Desafio: escreva um método que recebe um
Produtoe altera seu nome; explique por que a mudança "vaza" para fora.
9. Resumo#
class = referência (compartilhada na cópia); struct = valor (copiado). Use class para entidades; struct para valores pequenos e imutáveis.
10. Próximos Passos#
A seguir, onde esses tipos vivem: stack, heap e boxing.
11. Referências#
- Microsoft Learn — Tipos de valor e de referência
- Microsoft Learn — Tipos struct
- Microsoft Learn — Escolhendo entre class e struct