English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tipi di valore e di riferimento C#

In C#, i tipi di dati vengono classificati in base al modo in cui memorizzano i valori nella memoria. C# include le seguenti categorie di tipi di dati:

  1. Tipi di valore

  2. Tipi di riferimento

  3. Tipi di puntatore

Tipi di valore

Se un tipo di dati memorizza i valori nei propri spazi di memoria, è un tipo di valore. Questo significa che le variabili di questi tipi di dati contengono direttamente i valori.

Tutti i tipi di valore derivano daSystem.ValueTypeDerivato, mentreSystem.ValueTypeE ancora daSystem.ObjectDerivato.

Ad esempio, la variabile intera int i = 100;

Il sistema memorizza 100 nello spazio di memoria assegnato alla variabile i. La seguente immagine spiega come memorizzare 100 in una posizione ipotetica della memoria di 'i' (0x239110):

Assegnazione di memoria per variabili di tipo valore

Tutti i seguenti tipi di dati sono di tipo valore:

  • bool

  • byte

  • char

  • decimal

  • double

  • enum

  • float

  • int

  • long

  • sbyte

  • short

  • struct

  • uint

  • ulong

  • ushort

Passare variabili di tipo valore

  Quando si passa una variabile di tipo valore da un metodo all'altro, il sistema crea una copia separata della variabile nell'altro metodo. Se si modifica un valore in un metodo, non influenzerà la variabile nell'altro metodo.

static void ChangeValue(int x)
{
    x = 200;
    Console.WriteLine(x);
}
static void Main(string[] args)
{
    int i = 100;
    Console.WriteLine(i);
    
    ChangeValue(i);
    
    Console.WriteLine(i);
}
Output:

100
200
100

Nell'esempio sopra, anche dopo aver passato il variabile i del metodo Main al metodo ChangeValue e cambiato il suo valore, essa rimane invariata.

Tipi di riferimento

Diversamente dai tipi di valore, i tipi di riferimento non memorizzano direttamente il loro valore. Al contrario, memorizzano l'indirizzo dell'altra posizione di memorizzazione che sta memorizzando i valori. In altre parole, i tipi di riferimento contengono un puntatore verso un'altra posizione di memorizzazione che sta memorizzando dati.

Ad esempio, le seguenti variabili di stringa:

string s = "Hello World!!";

La seguente immagine mostra come il sistema assegna memoria per la variabile di stringa sopra menzionata.

Assegnazione di memoria per variabili di tipo riferimento

Come illustrato nell'immagine, il sistema seleziona una posizione casuale nella memoria per la variabile s (0x803200). Il valore della variabile s è 0x600000, che è l'indirizzo di memoria dell'effettivo valore di dati. Pertanto, i tipi di dati di riferimento memorizzano l'indirizzo della posizione effettiva dei valori, non i valori stessi.

Ecco i tipi di dati di tipo riferimento:

  • Stringhe

  • Array (anche se i loro elementi sono di tipo valore)

  • Classi

  • Deleghe

Passaggio di variabili di tipo riferimento

Quando si passa una variabile di tipo riferimento da un metodo all'altro, non viene creata una nuova copia; al contrario, viene passata l'indirizzo della variabile. Pertanto, se si cambia il valore della variabile all'interno del metodo, questa modifica si rifletterà anche nel metodo chiamante.

static void ChangeReferenceType(Student std2)
{
    std2.StudentName = "Steve";
}
static void Main(string[] args)
{
    Student std1 = new Student();
    std1.StudentName = "Bill";
    
    ChangeReferenceType(std1);
    Console.WriteLine(std1.StudentName);
}
Output:
Steve

Nell'esempio precedente, abbiamo passato l'oggetto Student std1 al metodo ChangeReferenceType(). Qui, esso passa effettivamente l'indirizzo di memoria di std1. Pertanto, quando il metodo ChangeReferenceType() cambia StudentName, sta effettivamente modificando StudentName dell'oggetto std1, poiché std1 e std2 puntano allo stesso indirizzo di memoria nel sistema di memoria.

Valore null

  Il valore predefinito null di un variabile di tipo di riferimento è non inizializzato. Null rappresenta il non riferimento a nessun oggetto.

Tipi di riferimento vuoti

Le variabili di tipo valore non possono essere null perché salvano valori invece di indirizzi di memoria. C# 2.0 ha introdotto i tipi nullable, che consentono di assegnare null a variabili di tipo valore o di dichiarare variabili di tipo valore senza assegnare loro un valore.