Pages

C# Boxing and unboxing

Boxing: değer türünden  bir değişkeni referans türünden bir nesneye aktarma işlemidir.Unboxing : bunun tersidir. Burda değişkenlerin hangi bellekte tutulduğu asıl önemli olan noktadır. referans tipleri (Reference type) ve değertipleri (value type) boxing unboxing in temelinş oluşturur.

Value type’lar stack (Yığın) Reference type ise Heap(öbek) de tutulmaktadır. Reference tipleri Şunlardır : Delegate, İnterface, Strings,object,class . Value tpleri ise bildiğimiz ; int , float , double,char…vb tiplerdir.

Boxing :


using System;

namespace İbo
{
class İbrahiminClasi
{
static void Main(string[] args)

{
int ibo=120;
object obj=ibo;

Console.WriteLine(“Değer tipli değişken = {0}”,ibo);
ibo=300;
Console.WriteLine(“Değer tipli değişken = {0}”,ibo);
Console.WriteLine(“referans tipli değişken = {0}”,obj);
}

}

}

 

ekran cıktısı:

Değer tipli değişken = 120
Değer tipli değişken = 300
referans tipli değişken = 120

Çünkü object obj Satırında stackta tutulan ibo Değişkeninin Bir kopyası heap de oluşturuldu ve bunun referansı obj değişkeninde tutuldu. Biz ibo değişkeninin değerini değiştirdiğimizde stacktaki değer değişti fakat heapde oluşturduğumuz değer değişmedi.Böylece Boxing işlemimizi yapmış olduk.

Burda boxing de Kopyalam kısmı otomatik olarak yapıldı.

 

Unboxing :

using System;

namespace ibrahiminclasi
{
class ibrahim
    {
static void Main(string[] args)
        {
double ibo=111111111111111;
object obj;

            obj=ibo;

            Console.WriteLine(ibo.ToString());
            Console.WriteLine(obj.ToString()); 
            ibo=ibo+10;
            Console.WriteLine(ibo.ToString());
            Console.WriteLine(obj.ToString());

    double yenibo;
            yenibo=(double)obj;
            Console.WriteLine(yenibo.ToString());

        }
    }
}

burda önce stackta ibo adlı değer tutulur sonra bu değerin heap de bir kopyası oluşturulur(boxing).  Ve arkasından stack’ta bulunan değer tipli değişkenin değeri değiştirdi. fakat referans tipli değişken heapte etkilenmemiştir. Burda kutulama işlemi bitiyor . arkasından kutudan çıkarma işlemi başlıyor. ve Heap te bulunan obj nesnesinin (referans tipli) value tipli değişkene yenibo ya aktarılıyor. Yani boxing işlemi ile kutulanmış bir veri kümesi, öbekten alınıp tekrar yığındaki bir alana konulmuş, dolayısıyla kutudan çıkartılmıştır.