English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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:
Tipi di valore
Tipi di riferimento
Tipi di puntatore
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):
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
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); }
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.
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.
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
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); }
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.
Il valore predefinito null di un variabile di tipo di riferimento è non inizializzato. Null rappresenta il non riferimento a nessun oggetto.
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.