Sobes.tech
Junior

Cosa sono i tipi di dati di riferimento?

sobes.tech AI

Risposta dell'AI

I tipi di dati di riferimento memorizzano non il valore stesso, ma un riferimento (indirizzo in memoria) al luogo in cui si trova quel valore.

Caratteristiche:

  • Le variabili di tipo riferimento possono contenere un riferimento a null.
  • Quando si assegna il valore di una variabile di tipo riferimento a un'altra, non si copia il valore stesso, ma il riferimento. Entrambe le variabili puntano allo stesso luogo in memoria.
  • Le modifiche apportate tramite un riferimento saranno visibili dall'altra, se entrambe puntano allo stesso oggetto.
  • La memoria per gli oggetti di tipi di riferimento è gestita dal garbage collector.

Esempi di tipi di dati di riferimento:

  • Stringhe (String)
  • Array
  • Oggetti di classi personalizzate
  • Delegati (in alcuni linguaggi)

Differenze rispetto ai tipi di dati di valore:

Caratteristica Tipi di dati di valore Tipi di dati di riferimento
Memoria Il valore stesso Un riferimento al valore
Copia Si copia il valore stesso Si copia il riferimento
Modifica Le modifiche nella copia non influenzano l'originale Le modifiche tramite un riferimento sono visibili dall'altra (se entrambe puntano allo stesso oggetto)
Memoria Gestita dallo stack (normalmente) Gestita dall'heap, liberata dal garbage collector
Esempi int, float, bool, struct (in alcuni linguaggi) String, Array, Object
// Esempio in C#
string s1 = "Hello"; // s1 memorizza un riferimento alla stringa "Hello"
string s2 = s1;      // s2 ora memorizza lo stesso riferimento di s1

// Quando si modifica, non sarà visibile dall'altra referenza,
// perché le stringhe in C# sono immutabili.
// Quando si modifica, si crea una nuova stringa e si riassegna il riferimento.
s1 = "World"; 

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

int[] arr1 = { 1, 2, 3 }; // arr1 memorizza un riferimento all'array {1, 2, 3}
int[] arr2 = arr1;     // arr2 ora memorizza lo stesso riferimento

arr2[0] = 10;          // Modifica tramite arr2

Console.WriteLine(arr1[0]); // Stampa 10, la modifica è visibile anche tramite arr1

// Esempio in Java
String s1 = "Hello"; // s1 memorizza un riferimento alla stringa "Hello"
String s2 = s1;      // s2 ora memorizza lo stesso riferimento di s1

// Le stringhe in Java sono immutabili.
// Quando si modifica, si crea una nuova stringa e si riassegna il riferimento.
s1 = "World"; 

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

int[] arr1 = { 1, 2, 3 }; // arr1 memorizza un riferimento all'array {1, 2, 3}
int[] arr2 = arr1;     // arr2 ora memorizza lo stesso riferimento

arr2[0] = 10;          // Modifica tramite arr2

System.out.println(arr1[0]); // Stampa 10, la modifica è visibile anche tramite arr1