Makale Özeti

Bu makalemde C#'da boxing ve unboxing kavramlarindan ve nelere dikkat etmemiz gerektiginden bahsedeceğim.

Makale

Tüm yazılımcı arkadaşlara selamlar,

Bu makalemde Csharp boxing/unboxing konularından bahsedeceğim.

İlk önce bu kavramların tam olarak ne anlama geldiğinden biraz bahsedelim.

Boxing 
Değer tipinden bir değişkenin, object türüne bilinçsiz dönüştürülmesidir.
Unboxing
Boxing işleminin tam tersidir.
Obje türünden bir değişkenin, değer tipine bilinçli dönüştürülme işlemidir.

Değişkenler hafızada iki bölgede saklanırlar.Stack ve Heap.
Stack değer tipinden verileri depolarken Heap ise referans türünden verileri depolar.Stack'in Heap'ten farkı heap dinamik bellek bölgesidir.Değişkendir.
Stack'te int dbl bool gibi veriler tutulurken Heap'te object (sınıflar) tutulur.

Değişen algoritma veya kurduğumuz yapı itibariyle bazen değer tipi değişkenleri referans tipi değişkkenlere atamamız gerekebilir.
Aşağıdaki şemayı inceleyelim.

Bu şemada stack bölümünde int türünden i değişkenine 123 değeri atanmıştır.Ardından i değişkeni object türünden o değerine atıyoruz.Gördüğünüz üzere 
o heap alanında saklanmış ve stack bölümünde o'nun heap alanındaki adresi tutulmuştur.

Örneğimizi inceleyelim.

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);
    }
}
Değer tipi = 456
Referans tipi = 123
Press any key to continue

Görüldüğü gibi boxing işleminden sonra, değer heap'a kopyalandığından dolayı i'nin değeri değişse bile o bundan etkilenmiyor.

Gelelim unboxing kavramına.Bundan sonra anlatacaklarım şimdiye kadar anlattığım işlemlerin tam tersi.Tek farkı unboxing işleminde tür dönüşümü bilinçli olarak yapılmalıdır.Aksi taktirde c# InvalidCastException hatası fırlatır.

Aşağıdaki şemayı inceleyelim.

Bir önceki işlemde i değişkenini boxing işlemine tabi tutarak obje türünden oluşturduğumuz o değişkenini şimdi unboxing işlemine tabi tutarak tekrar değer tipinden olan j değişkenine atıyoruz.

Örneğimizi inceleyelim.

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 yanlış unboxing kullanımı.",e);
        }
    }
}
System.InvalidCastException: Specified cast is not valid.
at UnboxingTest.Main() in c:\lab\c#\alllabs\consoleapplication4\class1.cs
:line 10 Hata yanlış unboxing kullanımı.
Press any key to continue

Görüldüğü gibi obje türünden değer tipine unboxing işlemi yaparken integer türünü short olarak dönüştürmeye çalıştığımızda c# bize yukardaki hatayı fırlattı.

Unboxing işleminde işlem sonucu üretilecek tür boxing işleminde kullanılan tür ile aynı olmalıdır.

Evet bir makalenin daha sonuna geldik.Umarım yararlı olmuştur.
Hepinize mutlu günler dilerim. 

Levent YILDIZ
Gulf Agency Company - TURKEY
IT Manager
MCP
msmoracle@hotmail.com 
levent.yildiz@gacworld.com 
http://www.gacworld.com

Kaynaklar
http://msdn.microsoft.com/