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