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.
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).
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
| Method | Mean | Error | StdDev | Median | Rank | Allocated |
|---|---|---|---|---|---|---|
| InstanciarClass | 0.0034 ns | 0.0057 ns | 0.0051 ns | 0.0010 ns | 1 | - |
| InstanciarStruct | 0.0014 ns | 0.0031 ns | 0.0029 ns | 0.0000 ns | 1 | - |
| CriarStructComReferencia | 0.0075 ns | 0.0110 ns | 0.0103 ns | 0.0000 ns | 1 | - |
| CriarStructPura | 0.0048 ns | 0.0038 ns | 0.0036 ns | 0.0041 ns | 1 | - |