Sobes.tech
Junior

O que são tipos de dados de referência?

sobes.tech IA

Resposta da IA

Os tipos de dados de referência armazenam não o valor em si, mas uma referência (endereço na memória) ao local onde esse valor se encontra.

Características:

  • Variáveis de tipo referência podem armazenar uma referência a null.
  • Ao atribuir o valor de uma variável de tipo referência a outra, não é copiado o valor em si, mas a referência. Ambas as variáveis apontam para o mesmo local na memória.
  • As alterações feitas através de uma referência serão visíveis na outra, se ambas apontarem ao mesmo objeto.
  • A memória para objetos de tipos de referência é gerida pelo coletor de lixo.

Exemplos de tipos de dados de referência:

  • Strings (String)
  • Arrays
  • Objetos de classes personalizadas
  • Delegados (em algumas linguagens)

Diferenças em relação aos tipos de dados de valor:

Característica Tipos de dados de valor Tipos de dados de referência
Armazenamento O valor em si próprio Uma referência ao valor
Cópia Copia-se o valor em si Copia-se a referência
Modificação As alterações na cópia não afetam o original As alterações através de uma referência são visíveis na outra (se ambas apontarem ao mesmo objeto)
Memória Gerida pela pilha (normalmente) Gerida pelo heap, libertada pelo coletor de lixo
Exemplos int, float, bool, struct (em algumas linguagens) String, Array, Object
// Exemplo em C#
string s1 = "Hello"; // s1 armazena uma referência à string "Hello"
string s2 = s1;      // s2 agora armazena a mesma referência que s1

// Ao modificar, não será visível através da outra referência,
// porque as strings em C# são imutáveis.
// Ao modificar, cria-se uma nova string e a referência é reatribuída.
s1 = "World"; 

Console.WriteLine(s2); // Mostra "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 armazena uma referência a um array {1, 2, 3}
int[] arr2 = arr1;     // arr2 agora armazena a mesma referência

arr2[0] = 10;          // Alteração através de arr2

Console.WriteLine(arr1[0]); // Mostra 10, a alteração é visível através de arr1

// Exemplo em Java
String s1 = "Hello"; // s1 armazena uma referência à string "Hello"
String s2 = s1;      // s2 agora armazena a mesma referência que s1

// As strings em Java são imutáveis.
// Ao modificar, uma nova string é criada e a referência é reatribuída.
s1 = "World"; 

System.out.println(s2); // Mostra "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 armazena uma referência a um array {1, 2, 3}
int[] arr2 = arr1;     // arr2 agora armazena a mesma referência

arr2[0] = 10;          // Alteração através de arr2

System.out.println(arr1[0]); // Mostra 10, a alteração é visível através de arr1