Junior
Qual é a diferença entre classes e estruturas em C#?
sobes.tech IA
Resposta da IA
As classes são tipos de referência, as estruturas são tipos de valor.
- Localização na memória: Instâncias de classes são colocadas no heap gerenciado, estruturas no stack ou dentro do objeto ao qual pertencem.
- Herança: Classes suportam herança, estruturas não. Estruturas podem implementar interfaces.
- Valor padrão: Para classes,
nullé o valor padrão. Para estruturas, um conjunto de zeros para os campos. - Passagem para métodos: Instâncias de classes são passadas por referência (é passada a referência ao objeto). Estruturas são passadas por valor (uma cópia é criada).
- Desempenho: Estruturas podem ser mais rápidas que classes para objetos pequenos, pois evitam custos de gerenciamento de heap e coleta de lixo. No entanto, passar estruturas grandes por valor pode ser menos eficiente.
- Criação: Para estruturas, um construtor implícito sem parâmetros inicializa os campos com zeros. Para classes, é necessário um construtor explícito sem parâmetros se outros construtores forem definidos.
| Característica | Classe (Class) | Estrutura (Struct) |
|---|---|---|
| Tipo | Referência | Valor |
| Localização na memória | Heap gerenciado | Stack / Interna |
| Herança | Suporta | Não suporta (mas implementa interfaces) |
| Valor padrão | null |
Conjunto de zeros |
| Passagem | Por referência | Por valor |
| Desempenho | Pode ser mais lento para objetos pequenos | Pode ser mais rápido para objetos pequenos |
| Construtor implícito | Não (se houver outros) | Sim (inicialização a zeros) |
// Exemplo de classe
public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}
// Exemplo de estrutura
public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
// Demonstração de passagem
public void ModifyPoint(PointClass pc, PointStruct ps)
{
pc.X = 100; // Alterará o PointClass original
ps.X = 100; // Alterará apenas a cópia de PointStruct
}
// Uso
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);
ModifyPoint(pointClass1, pointStruct1);
// pointClass1.X será 100
// pointStruct1.X será 1 (pois apenas a cópia foi alterada)