O post gerenciamento de memória em C# explica como funciona o gerenciamento de memória realizado pelo computador e demonstra como funciona a passagem de parâmetros por valor e por referência nas funções.
O computador realiza o gerenciamento de memória em C# dividindo a memória em duas áreas, a área denominada Stack e a área denominada Heap.
A área denominada Stack funciona em formato de pilha, ocupando uma pequena área da memória RAM (alguns KB). Já a área denominada Heap ocupa a maior área da memória, alterando seu tamanho dinamicamente conforme a necessidade.
O Heap é acessado indiretamente, por meio de referência, por isso chamamos os dados da Heap de “Reference Type”. O custo de se criar um objeto na Heap é muito maior do que na Stack, sendo assim na área de memória Stack nós temos os Value Types que são as variáveis do Tipo numérico (int, long, short etc), ponto flutuante (float, double), decimal, booleanos (true e false) e estruturas definidas pelo usuário (struct). Na Heap nós temos os Reference Types do tipo: Classes, Interfaces e Delegates.
As características dos tipos alocados em cada uma dessas áreas são as seguintes:
Value Types:
Uma variável deste tipo contém o valor, e não um endereço de referência para o valor;
Derivam de System.ValueTypes;
Variáveis de escopo local precisam ser inicializadas antes de serem utilizadas;
Atribuir o valor de variável a outra, implicitamente, é feita uma cópia do conteúdo da variável. Sendo assim, qualquer alteração no conteúdo de uma delas, não afetará a outra. Quanto maior for um objeto deste tipo mais custosa será sua cópia.
Reference Types:
Uma variável contém a referência (ou endereço) para o objeto que está na Heap;
Atribuir o valor de uma variável para outra faz uma cópia da referência, e não do próprio objeto. Ou seja, não é feita a cópia do objeto, e sim do endereço de memória do objeto, o que não gera muito custo para objetos grandes;
São alocados na Heap e seus objetos são coletados pelo Garbage Collector;
São passados por referência, enquanto que Value Types são passados por valor. Ou seja, a alteração de um objeto afetará todas as instâncias que apontam para ele.
O Garbage Collector (GC)
Como na Heap todos objetos são referenciados, o GC verifica se existe alguma variável fazendo referência a determinado objeto, caso não encontre ele desaloca “Coleta” aquela área de memória. Um fato interessante, por mais que se chame o Garbage Collector a sensação que temos é de que ele irá entrar em ação no mesmo instante, mas não, estamos apenas sinalizando a ele. “Passe por aqui GC”.
Passagem de Parâmetros por Valor ou por Referência
Acesse nosso canal no YouTube para visualizar outros vídeos sobre programação, como por exemplo Python, Java e Desenvolvimento de sistemas comerciais utilizando a linguagem C#.
Mestre em Ciência da Computação pela Universidade Estadual de Maringá - UEM, Pós-Graduado em Redes de Computadores e Comunicação de Dados pela Universidade do Estado do Paraná - UEL, Bacharel em Ciência da Computação pela Universidade do Oeste Paulista - UNOESTE.
Atuo na área acadêmica como professor desde 2006. Atualmente leciono na UNOESTE (Universidade do Oeste Paulista), no SENAC (Serviço Nacional de Aprendizagem Comercial) e possuo vários cursos na Udemy (https://www.udemy.com/user/danilo-filitto/).
Além disso, sou o CEO dos sites https:www.dfilitto.com.br e https:www.makeindiegames.com.br
Você também pode me encontrar no YouTube por meio do endereço https://www.youtube.com/danilofilittoppr
Aprenda a criar seus próprios jogos com os melhores desenvolvedores
Gerenciar Consentimento de Cookies
Para fornecer as melhores experiências, usamos tecnologias como cookies para armazenar e/ou acessar informações do dispositivo. O consentimento para essas tecnologias nos permitirá processar dados como comportamento de navegação ou IDs exclusivos neste site. Não consentir ou retirar o consentimento pode afetar negativamente certos recursos e funções.
Funcional
Sempre ativo
O armazenamento ou acesso técnico é estritamente necessário para a finalidade legítima de permitir a utilização de um serviço específico explicitamente solicitado pelo assinante ou utilizador, ou com a finalidade exclusiva de efetuar a transmissão de uma comunicação através de uma rede de comunicações eletrónicas.
Preferências
O armazenamento ou acesso técnico é necessário para o propósito legítimo de armazenar preferências que não são solicitadas pelo assinante ou usuário.
Estatísticas
O armazenamento ou acesso técnico que é usado exclusivamente para fins estatísticos.O armazenamento técnico ou acesso que é usado exclusivamente para fins estatísticos anônimos. Sem uma intimação, conformidade voluntária por parte de seu provedor de serviços de Internet ou registros adicionais de terceiros, as informações armazenadas ou recuperadas apenas para esse fim geralmente não podem ser usadas para identificá-lo.
Marketing
O armazenamento ou acesso técnico é necessário para criar perfis de usuário para enviar publicidade ou para rastrear o usuário em um site ou em vários sites para fins de marketing semelhantes.