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
objectou 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 };