Sobes.tech
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)