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