Olá! Tuesday, 28 de March de 2017.



Dicas CódigoFonte.net
Saturday, 02 de August de 2008

Qual a diferença entre Value Types e Reference Types

Oi Pessoal,

As vezes quando estamos desenvolvendo nossas aplicações, não nos preocupamos em estudar a fundo os tipos de dados que iremos utilizar em nossas variaveis, isso pode acontecer por falta de tempo ou mesmo de conhecimento do que esta pesquisa pode nos ajudar.

No .Net, possuimos dois tipos de tipos de variáveis: Value Types e Reference Types.

Value Types

As Value Types são os tipos mais simples utilizados no .Net e são armazenados no stack, lá o runtime pode facilmente e rapidamente criar, editar, ler ou excluir sem que haja um grande processamento.

Os tipos mais comuns de Value Types são: sbyte, byte, int ou Integer, uint ou UInteger, long, single ou float e decimal.

Reference Types

Já as Reference Types são tipos um pouco mais... não queria dizer complexo, mas um pouco mais difícil de processar do que os Value Types. Porque estes tipos são armazenados no heap, que é uma área da memória que possui referências aos dados atuais das variaveis que utilizamos. Com isto, o .Net precisa de um procedimento que fica de tempos em tempos verificando se os valores estão ou não mais sendo utilizados. Este procedimento é chamado de Garbage Colletor ou Coletor de Lixo.

Na prática

Um outro ponto interessante é que quando utilizamos estruturas (structs) do tipo Value Types e utilizamos uma outra estrutura que copia esta, os valores destas estruturas são indepentes e não sofrem alterações quando modificamos o valor de uma delas. Por exemplo:

Imaginemos que temos uma estrutura chamada Numeros, que possui variaveis para incrementarmos os valores. Então, criamos duas variaveis onde a primeira é inicializada com zero e a segunda é a cópia da primeira. Depois, alteramos os valores de cada uma das estruturas e vemos que eles serão independentes, veja:

  1. // nossa estrutura
  2. struct Numeros
  3. {
  4.     public int valor;
  5.  
  6.     public Numeros(int _valor)
  7.     {
  8.         valor = _valor;
  9.     }
  10.  
  11.     public override string ToString()
  12.     {
  13.         return valor.ToString();
  14.     }
  15. }
  16.  
  17. // a criação das variaveis
  18. Numeros n1 = new Numeros(0);
  19. Numeros n2 = n1;
  20. n1.valor += 1;
  21. n2.valor += 2;
  22.  
  23. Console.Write("n1 = {0}, n2 = {1}", n1, n2);
  24.  
  25. // veja que o resultado disso é:
  26. // n1 = 1, n2 = 2



Mas e se no lugar de struct, usarmos class, que é uma Reference Type? Se você fizer o teste, vai notar que o valor de n1 foi substituido por 3 e o n2 também é 3, por que? Porque uma Reference Type irá modificar os valores de todas as variaveis que são referencia dela, e como a n2 é uma referencia de n1, pois estamos igualando, quando incrementamos o valor de n2, o valor de n1 também se altera.

Viu como é importante sabermos diferenciar os tipos?

Bom pessoal, por hoje é só.

Até a próxima.


Comentários do artigo [Novo comentário]

RICARDO BASSMAN - 28 de July de 2012 - 00:44
vlw brother!
Para adicionar um comentário você deve efetuar o login


Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:


CodigoFonte.net » CodigoFonte.eti.br » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010