Spre deosebire de câteva limbi de programare, C # are două tipuri de tipuri de date: pentru valoare și pentru referință. Dacă performanța unei aplicații este semnificativă sau există interes pentru modul în care C # gestionează datele și memoria, este important să cunoaștem diferențele dintre aceste tipuri.
Tipul de valoare stochează conținutul său în memoria alocată pe stivă. De exemplu, valoarea 42 în acest caz este stocată într-o zonă de memorie numită stivă.
Atunci când variabila x iese din domeniul de acțiune din cauza finalizării executării metodei în care a fost declarată, valoarea este eliminată din stivă.
Utilizarea unei stive este eficientă, dar durata de viață limitată a tipurilor de valori le face mai puțin potrivite pentru partajarea datelor între diferite clase.
În schimb, un tip de referință, cum ar fi o instanță a unei clase sau a unei matrice, este plasat într-o altă zonă a memoriei, numită heap. În exemplul următor, spațiul necesar pentru o serie de zece întregi este plasat pe heap.
int [] numere = int int [10];
Boxing și Unboxing
int i = 67; // i este un tip de valoare
obiect o = i; // i este în cutie
System.Console.WriteLine (i.ToString ()); // i este în cutie
Veți întâlni dezarhivarea când folosiți clase concepute pentru a fi utilizate cu obiecte: de exemplu, utilizând un ArrayList pentru a stoca numere întregi. Când stocați un număr întreg în ArrayList, este în cutie. Când extrageți un număr întreg, acesta trebuie să fie fără cutie.
noul System.Collections.ArrayList (); // este un tip de referință
int n = 67; // n este un tip de valoare
list.Add (n); // n este în cutie
n = (int) listă [0]; // lista [0] este fără cutie
Ambalarea și despachetarea
Un pachet este un proces de conversie a unui tip de valoare la un tip de referință. Pentru a pachete o variabilă, trebuie să creați o variabilă de referință care indică o copie nouă în heap. Variabila de referință este un obiect, prin urmare, pot fi utilizate toate metodele moștenite de fiecare obiect, de exemplu, ToString (). Următorul cod arată cum se întâmplă acest lucru.
int i = 67; // i este un tip de valoare
obiect o = i; // i este în cutie
System.Console.WriteLine (i.ToString ()); // i este în cutie
Despachetarea este folosită pentru clasele destinate lucrului cu obiecte: de exemplu, folosind ArrayList pentru a stoca numere întregi. Ambalarea este utilizată pentru stocarea numerelor întregi în ArrayList. Când se extrage un număr întreg, trebuie să se despacheteze.
noul System.Collections.ArrayList (); // este un tip de referință
int n = 67; // n este un tip de valoare
list.Add (n); // n este în cutie
n = (int) listă [0]; // lista [0] este fără cutie