Na plataforma .NET existe 2 tipos de variáveis Value Types (Tipos Valores) e Reference Type (Tipo Referencia) é muito importante conhecermos estes dois tipos. Para simplificar o artigo adotaremos os alias TV para Tipo Valor e TR para Tipo referencia, primeiramente vamos ver um pouco da teoria.
A principal diferença delas são que as váriaveis TV são armazenadas na memória Stack e as do tipo TR são armazenadas na memória Heap. A memória Stack é alocada quando o aplicativo começa a ser executado, o framework usa esta área para fazer a manipulação das váriaveis do sistema, os valores colocados ali são descartados o mais rapido possivel.
A memória stack ela tem uma performance melhor do que a Heap, isto porquê
No time das TV temos algumas váriaveis nativas do Framework, tais como, int, float, double, boolean e structs, quando criamos uma váriavel deste tipo o framework aloca memória na Stack suficiente para armazenar a informação, por exemplo, quando declaramos uma váriavel do tipo int ele aloca 4 bytes(32 bits).
Ja as TR são váriaveis do tipo objeto, composta tanto por objetos nativos do framework quanto objetos customizados (Ex: clsClientes). Quando declaramos uma váriavel desse tipo o framework aloca na stack memória suficiente para armazenar o caminho da váriavel e o real local somente será alocado quando dermos um new no nosso objeto neste momento o compilador alocará na memória heap espaço suficiente para armazenar o objeto e colocará no espaço préviamente armazenado na stack o endereço de memória apontando para a heap.
A teoria é meio confusa ,mais vamos para prática que ficará mais claro.
Tipo valor
Vamos criar uma váriavel int e atribuir um valor para ela, logo em seguida vamos criar uma outra váriavel do tipo int e passar o valor de uma para outra.
int v1 = 10;
int v2 = v1;
Observe o quadro:
Stack |
Heap |
v1 | |
v2 |
Quando declaramos a variavel v1 e colocamos um valor para ela o framework aloco o espaço na Stack e armazenou o valor neste espaço, na hora que declaramos a váriavel v2 e atribuimos a ela v1 ele copio o valor de v1 e inseriu no espaço de v2. Até aqui tudo bem nenhum mistério.
Tipo Referência
Agora vamos criar uma váriavel objeto do tipo clsCliente e atribuir à outra váriavel do mesmo tipo.
clsCliente objCliente1 = new clsCliente();
clsCliente objCliente2 = objCliente1;
Observe o quadro:
Stack | Heap |
objCliente1 | clsCliente |
objCliente 2 |
Quando declaramos objCliente1 ele alocou memória na Stack onde será armazenado somente o endereço de memória Heap, quando chamamos o new ele aloca a memória Heap e armazena o objeto propriamente dito. Quando atribuimos objCliente1 em objCliente2 o framework copia somente a referencia de memória, ou seja, ele não criará outro espaço na Heap e copiará os valores do objeto, ele simplesmente criará um novo endereço na stack apontando para o mesmo objeto na Heap. Se você fizer algo como:
clsCliente objCliente1 = new clsCliente();
objCliente1.Nome = “Milton”;
clsCliente objCliente2 = objCliente1;
objCliente2.Nome = “Cleverton”;
MessageBox.Show(objCliente1.Nome);
O valor a ser mostrado será Cleverton, isso porquê as duas váriaveis apontam para o mesmo objeto, qualquer alteração que fizermos em ambas váriaveis será refletida na outra. Existem formas de se duplicar um objeto sem manter essa referencia mais isso é assunto para o proximo artigo J.
Um ponto que devemos chamar atenção é para o tipo string ele é do tipo referencia, o tipo string nada mais é que uma coleção de objetos char.
Bom galera por enquanto é só, espero que tenha ficado claro os tipos de variáveis, espero o feedback de vocês e até o proximo artigo.
Artigo escrito por Milton Filho em seu Blog – http://www.miltonfilho.net/ .
Facebook
Twitter
Instagram
LinkedIn
RSS