Jump to content

C# Boxing & Unboxing


wmismail

Recommended Posts

Tüm yazilimci arkadaşlara selamlar,

Bu makalemde Csharp boxing/unboxing konularindan bahsedecegim.

Ilk önce bu kavramlarin tam olarak ne anlama geldiginden biraz bahsedelim.

1000000606_Pencil.gifBoxing

değer tipinden bir degiskenin, object türüne bilinçsiz dönüstürülmesidir.

Unboxing

Boxing işleminin tam tersidir.

Obje türünden bir degiskenin, değer tipine bilinçli dönüstürülme işlemidir.Degiskenler hafizada iki bölgede saklanirlar.Stack ve Heap.

Stack değer tipinden verileri depolarken Heap ise referans türünden verileri depolar.Stack'in Heap'ten farki heap dinamik bellek bölgesidir.Degiskendir.

Stack'te int dbl bool gibi veriler tutulurken Heap'te object (siniflar) tutulur.

Degisen algoritma veya kurdugumuz yapi itibariyle bazen değer tipi degiskenleri referans tipi degiskkenlere atamamiz gerekebilir.

Asagidaki semayi inceleyelim.

1000000606_Boxing.jpgBu semada stack bölümünde int türünden i degiskenine 123 değeri atanmistir.Ardindan i degiskeni object türünden o değerine atiyoruz.Gördügünüz üzere

o heap alaninda saklanmis ve stack bölümünde o'nun heap alanindaki adresi tutulmustur.

Örnegimizi inceleyelim.

1000000606_Board.gif using System;

class TestBoxing

{

public static void Main()

{

int i = 123;

object o = i;

i = 456;

Console.WriteLine("değer tipi = {0}", i);

Console.WriteLine("Referans tipi = {0}", o);

}

} 1000000606_screen.jpg değer tipi = 456

Referans tipi = 123

Press any key to continueGörüldügü gibi boxing işleminden sonra, değer heap'a kopyalandigindan dolayi i'nin değeri degisse bile o bundan etkilenmiyor.

Gelelim unboxing kavramina.Bundan sonra anlatacaklarim simdiye kadar anlattigim işlemlerin tam tersi.Tek farki unboxing işleminde tür dönüsümü bilinçli olarak yapilmalidir.Aksi taktirde c# InvalidCastException hatasi firlatir.

Asagidaki semayi inceleyelim.

Boxing1.jpgBir önceki işlemde i degiskenini boxing işlemine tabi tutarak obje türünden olusturdugumuz o degiskenini simdi unboxing işlemine tabi tutarak tekrar değer tipinden olan j degiskenine atiyoruz.

Örnegimizi inceleyelim.

1000000606_Board.gif using System;

public class UnboxingTest

{

public static void Main()

{

int intI = 123;

object o = intI;

try

{

int intJ = (short) o;

Console.WriteLine("Unboxing Tamam.");

}

catch (InvalidCastException e)

{

Console.WriteLine("{0} Hata yanlis unboxing kullanimi.",e);

}

}

} 1000000606_screen.jpg System.InvalidCastException: Specified cast is not valid.

at UnboxingTest.Main() in c:\lab\c#\alllabs\consoleapplication4\class1.cs

:line 10 Hata yanlis unboxing kullanimi.

Press any key to continueGörüldügü gibi obje türünden değer tipine unboxing işlemi yaparken integer türünü short olarak dönüstürmeye çalistigimizda c# bize yukardaki hatayi firlatti.

1000000606_Can.gif Unboxing işleminde işlem sonucu üretilecek tür boxing işleminde kullanilan tür ile ayni olmalidir.Evet bir makalenin daha sonuna geldik.Umarim yararlı olmustur.

Hepinize mutlu günler dilerim.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...