No artigo anterior (Trabalhando com Tipos de Dados no .NET) iniciei uma série que pretende cobrir os principais aspectos funcionais da plataforma .NET. Iniciei apresentando as formas disponíveis para trabalharmos com dados no .NET Framework e, foquei o trabalho com Value Types (VT’s).
O artigo de hoje foca o trabalho com Reference Types (Tipos por Referência). Se você ainda não leu o artigo citado no parágrafo anterior e não possui conhecimentos equivalentes, aconselho fortemente a leitura.
O que são Reference Types (RT’s)?
Variáveis do tipo RT são aquelas que possuem a capacidade de armazenar endereços de memória, sendo que, nestes endereços estão armazenados valores reais. Diferentemente dos VT’s os RT’s são armazenados em uma região de memória conhecida como Stack enquanto os valores para os quais estas RT’s apontam são armazenados em outra região de memória, conhecida como Heap.
Para exemplificarmos esta idéia, considere as declarações apresentadas na Listagem 1:
int variavel1 = 10;
int variavel2 = variavel1;
Listagem 1: Declaração e utilização de dois VT’s (Value Type)
Se tomarmos como exemplo o código apresentado na Listagem 1, teremos na memória, a atividade apresentada na Figura 1:
Figura 1: Os VT’s variavel1 e variavel2 alocados na Stack
Ao analisarmos a Figura 1, fica fácil constatar que Value Types são armazenados na stack deixando assim, o heap inalterado. Considere agora o código apresentado na listagem 2:
clsCliente cliente1 = new clsCliente();
clsCliente cliente2 = cliente1;
Listagem 2: Declaração e utilização de dois RT’s (Reference Types)
Se tomarmos como exemplo o código apresentado na Listagem 2, teremos na memória, a atividade apresentada na Figura 2:
Figura 2: Os RT’s alocados na Stack e no Heap
Ao analisarmos as duas Figuras torna-se notória a diferença entre Value Types e Reference Types. Quando um VT é criado, o framework reserva na Stack um espaço com um respetivo nome para armazenar o valor. Quando esta variável recebe este valor, o valor é armazenado então naquela região e o acesso a este valor é feito diretamente.
Ao contrário, quando um RT é declarado, um espaço para armazenamento de um endereço de memória é criado na Stack. Quando através da palavra new criamos o objeto, a framework reserva um espaço no Heap sendo que, neste espaço, é onde estarão armazenados os valores para os quais a(s) variáveis apontarão.
Na listagem 1, quando variavel2 recebia variavel1 uma cópia do valor físico da variavel1 era enviado para variavel2. Já na listagem 2, quando cliente2 recebia cliente1, o que era copiado para cliente2 era do endereço de referência para cliente1 e não seus valores físicos.
Garbage Collection
No .NET Framework os RT’s são gerenciados automaticamente através de um mecanismo chamado de Garbage Collection (GC). Este recurso funciona basicamente da seguinte forma: periodicamente o GC rastreia a memória e verifica quais variáveis estão sem ser referenciadas a um bom tempo e, neste caso, destroe estas instâncias, liberando assim espaço subutilizado.
A partir da versão 2.0 da .NET Framework, o usuário possui o poder de chamar manualmente o GC. Isto é possível ao invocar-se o aplicativo GC.Collect. Muito embora esta possibilidade esteja disponível, vale a pena frisar que, executando de forma automática pela framework, o GC possui melhor desempenho e segurança.
Reference Types nativos na .NET Framework
O .NET Framework possui mais de 2.500 RT’s nativos. Na verdade, se o tipo não for derivado de System.ValueType é com certeza um Reference Type nativo. A Figura 3 apresenta alguns tipos comuns de Reference Types nativos.
Figura 3: Reference Types mais comumente utilizados no .NET Framework
Bom pessoal, por hora é isso. Enviem seus comentários para que eu possa ter um feedback sobre a aprovação ou desaprovação dos textos escritos para que eu possa melhorar cada vez mais a qualidade dos mesmos. Grande abraço a todos 🙂 .
Facebook
Twitter
Instagram
LinkedIn
RSS