Tipos de Referência (Reference Types)
Tipos de referência são um dos dois pilares fundamentais do sistema de tipos do C#. Diferente dos tipos de valor, uma variável de tipo de referência não armazena o dado diretamente. Em vez disso, ela armazena um endereço de memória (uma referência ou ponteiro) que aponta para o local onde o objeto real está armazenado. Esse local é uma área da memória chamada Heap.
Como Funciona a Memória?
A gestão da memória para tipos de referência envolve duas áreas:
Stack: A variável em si é criada na Stack. Ela é leve e contém apenas o endereço de memória do objeto.
Heap: O objeto real, com todos os seus dados, é alocado na Heap. A Heap é uma área de memória maior e mais flexível, gerenciada por um processo chamado Garbage Collector (Coletor de Lixo).
Diagrama: Variável e Objeto na Memória
Quando você cria um objeto, a variável na Stack aponta para o objeto na Heap.
Comportamento na Atribuição
Esta é a diferença mais crucial. Quando você atribui uma variável de referência a outra, você não está copiando o objeto, mas sim copiando o endereço de memória.
O resultado é que ambas as variáveis passam a apontar para o mesmo objeto na Heap. Qualquer modificação feita através de uma variável será visível através da outra.
Exemplo de Código
Diagrama: Cópia de Referência
Após var contaB = contaA;
, a situação da memória é a seguinte:
O Garbage Collector (GC)
Como a Heap é gerenciada dinamicamente, precisamos de um mecanismo para limpar objetos que não são mais necessários. É aqui que entra o Garbage Collector.
O GC periodicamente verifica a Heap em busca de objetos que não possuem mais nenhuma referência apontando para eles. Quando encontra esses objetos "órfãos", ele os remove e libera a memória para que possa ser reutilizada.
Se no nosso exemplo fizermos contaA = null;
e contaB = null;
, o objeto ContaBancaria
na Heap se tornaria elegível para a coleta de lixo.
Exemplos de Tipos de Referência
class
: O exemplo mais comum. Todas as classes que você cria são tipos de referência.object
: O tipo base para todos os outros tipos no .NET.string
: Embora às vezes se comporte como um tipo de valor (devido à sua imutabilidade),string
é um tipo de referência.Arrays: Vetores e matrizes (ex:
int[]
,string[]
) são sempre tipos de referência.Delegates e Interfaces.