Skip to main content

Class, Struct, Record | Artigo .NET

  • Class, Struct, Record | Artigo .NET

Classe

Tipo de Referência: Classes são tipos de referência, ou seja, armazenam uma referência aos dados em vez dos dados propriamente ditos.

Alocação na Heap: Objetos são alocados na heap, e o gerenciamento de memória é feito pelo garbage collector.

Quando Usar: Classes são geralmente usadas para estruturas de dados complexas, objetos de longa duração ou quando o tamanho ultrapassa 16 bytes.

Exemplo:

class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

Use a palavra-chave class para criar uma classe em C#. Você pode especificar um modificador de acesso (private, public, protected, internal), se necessário, para a classe.


Struct

Tipo de Valor: Structs são tipos de valor, ou seja, armazenam diretamente os dados.

Alocação na Pilha: Structs são normalmente alocados na pilha, o que pode resultar em melhor desempenho para instâncias pequenas e de curta duração.

Quando Usar: Prefira structs quando a estrutura de dados for pequena, imutável e representar logicamente um único valor. Evite structs se a estrutura for grande ou mutável.

Exemplo:

struct Person
{
public string Name { get; set; }
public int Age { get; set; }
}

Use a palavra-chave struct para declarar uma estrutura em C#. Modificadores de acesso também podem ser usados, se necessário.

warning

Em C#, campos de tipos de referência dentro de uma struct continuam sendo alocados na heap, mesmo que a struct esteja na pilha. O que fica na pilha é o ponteiro (referência).

info

Dentro da struct de preferencia precisa usar tipos de valor porque quando você usa um Equal em duas structs ele compara os valores dos atributos


Records

Tipo de Referência ou Valor: Records podem ser tipos de referência (record class) ou tipos de valor (record struct).

Igualdade por Valor: Ao contrário das classes, records enfatizam a igualdade por valor — ou seja, dois records com os mesmos dados são considerados iguais.

Imutabilidade: Records são imutáveis por padrão, tornando-os ideais para cenários em que os dados não devem mudar após a criação.

Quando Usar: Use records para estruturas de dados imutáveis, especialmente quando quiser uma sintaxe concisa, como em DTOs de requisição e resposta.

Exemplo:

public record Person(string Name, int Age);

Quando Usar Cada Um

  • Use Classe: Para a maioria dos cenários, especialmente ao lidar com objetos complexos ou quando o tamanho da instância excede 16 bytes.

  • Use Struct: Para estruturas de dados pequenas, simples e imutáveis, particularmente quando o desempenho é uma preocupação.

  • Use Record: Para dados imutáveis com igualdade por valor, como DTOs, ou quando desejar conveniência com métodos embutidos para deconstrução e exibição.


Conclusão:

Em resumo, a escolha entre classes, structs e records em C# depende do seu caso de uso específico.

  • Classes são ideais para objetos complexos e de longa duração.
  • Structs são melhores para dados simples, pequenos e críticos em termos de desempenho.
  • Records são excelentes para estruturas imutáveis com igualdade por valor.

Entender essas diferenças permite que você otimize seu código em termos de desempenho, manutenção e clareza.

Benchmark .NET

MethodMeanErrorStdDevMedianRankAllocated
InstanciarClass0.0034 ns0.0057 ns0.0051 ns0.0010 ns1-
InstanciarStruct0.0014 ns0.0031 ns0.0029 ns0.0000 ns1-
CriarStructComReferencia0.0075 ns0.0110 ns0.0103 ns0.0000 ns1-
CriarStructPura0.0048 ns0.0038 ns0.0036 ns0.0041 ns1-