Codigos Fonte, Artigos e Dicas
Tipo-Valor e Tipo-Referência no C#

Tipo-Valor (ou “value type” em inglês) é o coletivo dos tipos int, float, double e char, quando você declara uma variável tipo-valor o compilador gera instruções para alocar um bloco de memória grande o suficiente para o conter o valor correspondente.
Por exemplo, quando você declara alguma variável do tipo int o compilador gera as instruções para alocar 4 bytes (32 bits) de memória, quando você atribui algum valor a int o compilador faz com que o mesmo seja copiado para esse bloco, alocado anteriormente, na memória.
int algumInteiro; // aloca 4 bytes na memória algumInteiro = 125; // O valor “125” é copiado para dentro do espaço alocado
Tipo-Referência (reference type), é o tipo “classe” (definição de um objeto), são tratados diferentemente aos Tipo-Valor. Quando você declara uma classe, o compilador não gera instruções para alocar memória suficiente para armazenar a classe declarada, mas sim para alocar apenas uma pequena parte da memória para armazenar uma referência para outro bloco de memória que tenha a classe em si.
Resumindo tudo: Um endereço aponta para outro bloco na memória.
O armazenamento do objeto só é realmente alocado quando a a palavra-chave new é usada para instanciar um objeto (lembre-se que um objeto é a instância de uma classe). Uma classe é um exemplo de Tipo-Referência. Tipos referência contém referência a blocos de memória.
class Moto {
public int qtdTanqueGasolina;
public Moto(){
// Construtor padrão da classe Moto
}
} // Fim da classe
Moto intruder; // Aloca um pequeno espaço na memória para armazenar a referência do objeto intruder
intruder = new Moto(); // Agora a objeto Intruder é alocado para a memória onde está sendo referenciada pela instrução anterior.
Lembre-se que o tipo string não é um Tipo-Valor! O tipo string, ou melhor a palavra-chave “string” é apenas um alias para a classe System.String, consequentemente ela não é um tipo primitivo.
Quando você declara a variável primeiroInt como int e aloca a constante 150, na memória existe um pedaço só para a variável primeiroInt se você declara a variável segundoInt e executar a instrução “segundoInt = primeiroInt” você atribui o valor do primeiroInt ao segundoInt, embora eles tenham o mesmo valor existe dois blocos diferentes na memória, um para cada variável, assim logicamente se você modificar o valor do primeiroInt para 98 o segundoInt continuará tendo o valor 150 no seu outro espaço da memória.
Com variáveis do Tipo-Refência, acontece diferente, se você instanciar o objeto intruder da classe Moto você está referenciando a classe Moto com Intruder, ao declarar o objeto shadown e tentar passar o valor de intruder à shadown, como abaixo:
Moto intruder = new Moto(); Moto shadown = intruder;
Você está alocando na memória a variável shadown que é uma referência para o mesmo objeto que a variável intruder referencia.
Sendo desse jeito, se você mudar no objeto intruder o valor do campo qtdTanqueGasolina de “0″ (zero) para “8″ (oito) esse valor também será mudado no objeto shadown!. Porque shadown está apontando para o mesmo objeto que intruder, ou seja shadown e intruder são a mesma Moto, com dois nomes diferentes.
Até a próxima…
Posts Relacionados
| Imprimir artigo | Este artigo foi escrito por Alexandre Santos em 24 24UTC julho 24UTC 2009 às 23:52, e está arquivado em C# Linguagem. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |
- Utilizando Parâmetro por Referência em Métodos « Diario de Códigos
- Diário de Códigos
- C# Arrays « Diário de Códigos
- Percorrendo Todos TextBox « Diário de Códigos
- Tipos de dados em C# | Vitor A. Vale
- Funções parte 2 | Vitor A. Vale
- Dica Rápida: Passando Parâmetros Nullables para um Método « Programando .NET

há 2 anos atrás
Boa…bons conceitos ^^ Alexandre tbm é cultura… heheh
[Reply]
há 2 anos atrás
=D Valeu Paulo!
Talvez, muito talvez hoje ou apenas segunda-feira, sai mais alguns…
Abs…
[Reply]