Boxing si unboxing

Boxing–ul si unboxing–ul reprezinta modalitatea prin care C# permite utilizarea simpla a sistemului unificat de tipuri. Spre deosebire de Java, unde exista tipuri primitive (care nu pot contine metode) si tipuri referinta, ın C# toate tipurile sunt derivate din clasa object (alias System.Object). De exem-
plu, tipul int (alias System.Int32) este derivat din clasa System.ValueType care la randul ei este derivata din clasa object (alias System.Object). Ca atare, orice int este compatibil cu object.

Boxing: Conversia de tip boxing permite oricarui tip valoare sa fie implicit convertit catre tipul object sau catre un tip interfata implementat de tipul valoare. Boxing–ul unei valori consta ın alocarea unei variabile de tip obiect si copierea valorii initiale ın acea instanta. Procesul de boxing al unei valori sau variabile de tip valoare se poate ıntelege ca o simulare de creare de clasa pentru acel tip:
sealed class T_Box{
T value;
public T_Box(T t){
value = t;
}
}

Astfel, declaratiile:
int i = 123;
object box = i;

corespund conceptual la:
int i = 123;
object box = new int_Box(i);

Pentru secventa:
int i = 10;//linia 1
object o = i;//linia 2
int j = (int)o;//linia 3

procesul se desfasoara astfel: la linia 1, se declara si se initializeaza o variabila de tip valoare, care va contine valoarea 10; valoarea va fi stocata pe stiva. La linia 2 se va crea o referinta o catre un obiect alocat ın heap, care va contine atat valoarea 10, cat si o informatie despre tipul de data continut
(ın cazul nostru, System.Int32). Unboxing–ul se face printr–un cast explicit, ca ın linia 3.
Determinarea tipului pentru care s–a facut ımpachetarea se face prin intermediul operatorului is:
int i = 123;
object o = i;
if (o is int){
Console.Write(“Este un int!”);
}

Boxing–ul duce la o clonare a valorii care va fi continuta. Altfel spus, secventa:
int i = 10;
object o = i;
i++;
Console.WriteLine(“in o: {0}”, o);

va afisa valoarea nealterata 10.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s