Sobes.tech
Middle

Os objetos de estrutura podem estar no monte?

sobes.tech IA

Resposta da IA

Sim, podem.

Os objetos de estruturas, que são tipos de valor em C#, geralmente são armazenados na pilha. No entanto, podem estar no heap nos seguintes casos:

  • São campos de tipos de referência (classes). O objeto da classe está no heap, e os seus campos de estrutura serão armazenados junto com ele.
  • Boxing (encapsulamento). Quando um objeto de estrutura é convertido para um objeto do tipo object ou interface, ele é envolvido num tipo de referência e colocado no heap.
  • Elementos de arrays de estruturas. Um array (que é um tipo de referência) é colocado no heap, e os seus elementos de estrutura são armazenados na memória alocada para esse array.

Exemplo de boxing:

// O objeto de estrutura está na pilha
int valorInicial = 10;

// Boxing: a estrutura é empacotada num objeto e colocada no heap
object valorEmpacotado = valorInicial;

// É necessário um casting (desempacotamento) para trabalhar com o valor como int
int valorDesempacotado = (int)valorEmpacotado;

Exemplo de estrutura como campo de uma classe:

// O objeto da classe estará no heap
public class Contêiner
{
    // A estrutura como campo da classe será armazenada no heap junto com o objeto Contêiner
    public Ponto Coordenadas;
}

// Definição da estrutura
public struct Ponto
{
    public int X;
    public int Y;
}

// Criando um objeto da classe Contêiner no heap
Contêiner c = new Contêiner();

Exemplo de array de estruturas:

// O array de Ponto é um tipo de referência e é colocado no heap
Ponto[] arrayPontos = new Ponto[5];

// Os elementos do array (estruturas Ponto) serão armazenados na memória do heap alocada para o array
arrayPontos[0] = new Ponto { X = 1, Y = 2 };