C# Boxing ve Unboxing

Not : Net Framework’te value type ve referance type olmak üzere iki tür veri tipi vardır. Değer tipleri (Value type) stack (Yığın)’da Referans tipleri (Reference type) ise Heap (Öbek)’de tutulmaktadır. Referans tipleri : Dynamic, Delegate, Interface, Strings, Object, Class. Value tipleri ise ; int , float , double,char vb. tiplerdir.

Boxing

Boxing bir değer tipinin (value type) object yada herhangi bir interface tipine dolaylı (implicit) olarak dönüştürülme işlemi olarak tanımlanabilir.

Örnek bir değer tipinde (value type) değişken tanımı :

int i = 123;

Aşağıdaki atama ifadesine baktığımızda i değişkenine dolaylı (implicitly) olarak boxing işlemi uygulanmaktadır.

object o = i;

Böyle bir boxing işleminden sonra stack (yığın) üzerinde oluşturulan object türünden o değişkenine, stack (yığın)’da bulunan i değişkeninin kopyası heap (öbek)’te oluşturulup o değişkenine referans eder hale gelmiştir.

class TestBoxing
{
    static void Main()
    {
        int i = 123;
        // Boxing yaparak i değişkeninin değeri o değişkenine kopyalanıyor.
        object o = i;

        // i değişkeninin değerini değiştiriyoruz.
        i = 456;

        // i değişkenin değerinin değiştirilmesi,
        // o değişkeninde tutulan değişkenin değerini etkilemeyecektir
        System.Console.WriteLine("Değer tipi (value-type) değişken içeriği = {0}", i);
        System.Console.WriteLine("Obje tipi (object-type) değişken içeriği = {0}", o);
    }
}
/* Ekran çıktısı:
    Değer tipi (value-type) değişken içeriği = 456
    Obje tipi (object-type) değişken içeriği = 123
*/

Dikkat edileceği üzere atama işleminden sonra yapılan arttırma işlemi heap(öbek)’te
oluşan kopya değişkeni referans ettiğinden hala eski değeri tutmaktadır.

Unboxing

Unboxing object tipinin direk (explicit) olarak değer tipine (value type) yada interface tipinden bu interface implement eden tiplere dönüştürülme işlemi olarak tanımlanabilir.

int i = 123;      // değer tipi (value type)
object o = i;     // boxing
int j = (int)o;   // unboxing

Unboxing işlemi gerçekleştirilirken boxing işleminde kullanılmış veri tipinin aynısı kullanıldığına dikkat edilmelidir. Aksi halde veri tipleri uyuşmayacağından InvalidCastException hatası alınacaktır.

Hatalı bir kullanıma örnek verecek olursak :

int i = 123;
object o = i;  // boxing
int j = (short)o;  // unboxing
// Üst satırdaki gibi bir kullanım InvalidCastException hatasına sebep olacaktır.
// Aşağıdaki gibi düzenlendiğinde aynı tipte unboxing yapıldığından hata alınmayacaktır.
int j = (int) o;

Boxing ve Unboxing Performans

Boxing işlemi normal bir atama işleminden 20 kat daha uzun sürmektedir.
Unboxing işlemi ise yine normal bir atama işleminden 4 kat daha uzun sürmektedir.
Bu yüzden gerekli olmayan aşırı boxing ve unboxing kullanımı uygulamanızı gözle görülür bir biçimde yavaşlatacaktır.

Kaynak ;

Boxing and Unboxing (C# Programming Guide)

0 thoughts on “C# Boxing ve Unboxing”

Bir cevap yazın