Esercizio - Scoprire i tipi di riferimento
I tipi riferimento includono matrici, classi e stringhe. Per quanto riguarda le modalità di archiviazione dei valori durante l'esecuzione dell'applicazione, i tipi riferimento vengono trattati in modo diverso dai tipi valore.
In questo esercizio verranno illustrate le differenze tra i tipi riferimento e i tipi valore e come usare l'operatore new
per associare una variabile a un valore nella memoria del computer.
Differenze tra tipi riferimento e tipi valore
Una variabile di tipo valore archivia i valori direttamente in un'area di archiviazione denominata stack. Lo stack è la memoria allocata al codice attualmente in esecuzione nella CPU (definita anche stack frame o frame di attivazione). Al termine dell'esecuzione dello stack frame, i valori nello stack vengono rimossi.
Una variabile di tipo riferimento archivia i valori in un'area della memoria separata chiamata heap. L'heap è un'area della memoria condivisa tra più applicazioni in esecuzione contemporaneamente nel sistema operativo. Il runtime .NET comunica con il sistema operativo per determinare quali indirizzi di memoria sono disponibili e richiede un indirizzo in cui poter archiviare il valore. Il runtime .NET archivia il valore e quindi restituisce l'indirizzo di memoria alla variabile. Quando il codice usa la variabile, il runtime .NET cerca facilmente l'indirizzo archiviato nella variabile e recupera il valore archiviato.
Scriviamo un codice che illustri in modo più chiaro questi concetti.
Passaggio 2 - Definire una variabile di tipo riferimento
Eliminare o usare l'operatore di commento riga
//
per impostare come commento tutto il codice degli esercizi precedenti.Aggiornare il codice nell'editor di Visual Studio Code come indicato di seguito:
int[] data;
Il codice seguente definisce una variabile che può contenere un valore di tipo matrice
int
.A questo punto,
data
è semplicemente una variabile che può contenere un riferimento, o piuttosto un indirizzo di memoria di un valore nell'heap. Poiché non punta a un indirizzo di memoria, viene chiamata riferimento Null.Passaggio 3 - Creare un'istanza della matrice
int
usando la parola chiavenew
Aggiornare il codice nell'editor di Visual Studio Code per creare e assegnare una nuova istanza di
int
matrice usando il codice seguente:int[] data; data = new int[3];
La parola chiave
new
indica al runtime .NET di creare un'istanza della matriceint
e quindi di coordinarla con il sistema operativo per archiviarla in memoria. Il runtime .NET è conforme e restituisce un indirizzo di memoria della nuova matriceint
. L'indirizzo di memoria viene infine archiviato nei dati della variabile. Per impostazione predefinita, gli elementi della matriceint
hanno valore0
perché si tratta del valore predefinito diint
.Passaggio 4 - Modificare l'esempio di codice per eseguire entrambe le operazioni in una singola riga di codice
Le due righe di codice del passaggio 3 vengono in genere abbreviate in una sola riga di codice sia per dichiarare la variabile che per creare una nuova istanza della matrice
int
. Modificare il codice del passaggio 3 sostituendolo con il seguente.int[] data = new int[3];
Anche non vengono restituiti output da esaminare, lo scopo dell'esercizio era quello di chiarire la correlazione tra la sintassi C# e i passaggi del processo per l'uso dei tipi riferimento.
Quali sono le differenze del tipo di dati stringa C#?
Il tipo di dati string
è anche un tipo riferimento. Ci si potrebbe chiedere perché un operatore new
non è stato usato durante la dichiarazione di una stringa. Si tratta semplicemente di una comodità offerta dai progettisti di C#. Poiché il tipo di dati string
viene usato molto frequentemente, è possibile usare questo formato:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
Dietro le quinte, tuttavia, viene creata e inizializzata una nuova istanza di System.String
con "Hello World!".
Riepilogo
- I tipi valore possono contenere valori più piccoli e vengono archiviati nello stack. I tipi riferimento possono contenere valori grandi. Una nuova istanza di un tipo riferimento viene creata usando l'operatore
new
. Le variabili di tipo riferimento contengono un riferimento (l'indirizzo di memoria) al valore effettivo archiviato nell'heap. - I tipi riferimento includono matrici, stringhe e classi.