C# Boxing ve Unboxing

C# Dersleri Ahmet Şenlik 2.462 kez görüntülendi.

Önceki öğrenme faaliyetinde object türündeki değişkenlerin her başvuru türündeki nesneye başvurulabileceği öğrenildi. Şimdi ise object türündeki değişkenlerin bir değer türüne başvurduğunda ve object türündeki bir değişkenin bir değer türüne dönüştürüldüğünde neler olduğu incelenecektir.

Kutulama (Boxing)

Object türündeki değişkenler bir değer türüne de başvurulabilir. Örneğin, aşağıdaki iki ifade, a değişkenine 15 başlangıç değerini atar ve daha sonra o değişkenine başlangıç değeri olarak a atar:

int a = 15;
object o = a;

İkinci ifadede tam olarak neler olduğunu anlamak için biraz açıklama gerekir. a değişkeninin değer türünde olduğunu ve yığında tutulduğunu söylenmişti. o değişkeni içindeki başvuru, doğrudan a değişkenine başvuruyorsa başvuru yığın üzerindeki değere olacaktır. Ancak tüm başvurular öbek üzerindeki nesnelere başvurmalıdır. Yığın üzerindeki öğelere başvuru oluşturulamaz. Bu nedenle a içindeki değerin bir kopyası öbek üzerinde oluşturulur ve o içindeki başvuru bu kopyaya olur.
Öğenin yığından öbeğe otomatik kopyalanmasına kutulama (boxing) adı verilir. Aşağıdaki resimde bu durum gösterilmiştir.

boxing(kutulama)

Kutulama (Boxing)

Kutulamayı Kaldırma (UnBoxing)

Program içerisinde bazen kutulanmış değerlerin değer türünde değişkenlere aktarılması gerekir. Bu durumda kutulamayı kaldırmak zorunlu olur. Örneğin, az önceki örnekte int değer türündeki a değişkenine, içerisinde 15 tam sayı değerine başvuruyu barındıran object başvuru türündeki o değişkeni atamaya çalışılırsa derleme hatasıyla karşılaşılır.

int a = 15;
object o = a;
a = o; // Derleyici hatası

Aslında yukarıdaki kod ilk bakışta o değişkeni tam sayı bir değere başvuruda bulunduğu için mantıklı gibi görünebilir. Ancak object türündeki o değişkeninin başvuru türünde herhangi bir değişkene başvurabileceği de unutulmamalıdır. Aşağıdaki örneği incelendiğinde derleyicinin neden hata verdiği daha iyi görülebilir.

Bisiklet b = new Bisiklet();
int a = 10;
object o;
o = b;
a = o; // int türüne Bisiklet başvuru türü aktarılmaya çalışılıyor

Peki, kutulama kaldırıldığın ne yapılmalıdır? Kutulanmış değeri elde etmek için casting olarak bilinen ve bir türü diğerine dönüştüren işlem kullanılır. Bu, dönüştürülmek istenen değişkenin önüne parantez içinde türün adı yazılarak yapılır.

int i = 15;
object o = i; // kutulama
i = (int)o; // kutulamayı kaldırma

Bu dönüştürme işlemi daha iyi anlayabilmek için aşağıdaki şekil oluşturulmuştur.

kutulamayı kaldırma

Kutulamayı kaldırma(Unboxing)

Verileri Güvenli Olarak Dönüştürme

Derleyiciler her ne kadar yapılan hatalar hemen bildirilerek işi kolaylaştırsalar da bazı durumlarda derleyiciye yol göstermek gerekir. Dönüştürme işlem kullanılarak derleyiciye bir nesne tarafından başvurulan verinin özel bir türe sahip olduğu ve bu türü kullanarak nesneye başvurmanın güvenli olduğu belirtilebilir. Programlama dili dönüştürme işlemini gerçekleştirmeye yardımcı olabilecek oldukça kullanışlı iki işleç daha sunar: is ve as işleçleri

 

“is” İşleci

Değişken türünün istenilen türde olduğunu doğrulamak için is işleci kullanılabilir. is işleci iki işlenen alır. is işlecinin sol tarafına doğrulamak istenilen değişkeni, sağ tarafına ise tür adı yazılır.

int i = 15;
object o = i;
if (o is int)
{
   i = (int)o; // Güvenli kod: o int türündedir
}

Yukarıdaki örnekte de rahatlıkla görülebileceği gibi o değişkeninin başvurduğu değer türü eğer belirlenen türe (int) sahipse is işleci true, aksi takdirde false sonucu verir.

“as” İşleci

Değişken türünün hangi türde olduğunu derleyiciye anlatmak için as işleci kullanılabilir. as işleci de iki işlenen alır.

Bisiklet b = new Bisiklet();
object o = b;
Bisiklet c = o as Bisiklet;

as işleci nesneyi belirtilen türe dönüştürmeye çalışır. Başarılı ise sonuç döndürülür. Dönüştürme başarılı değilse as işleci null sonucu verir.

Kocaeli Üniversitesinde Bilgisayar Programcılığı okudum DGS ile 2016 yılında Sakarya Üniversitesi Bilgisayar mühendisliğini kazandım. Yazılımla uğraşmayı çok seviyorum bu alanda kendimi daha da geliştirmeyi düşünüyorum. Eğer siz de seviyorsanız bu işi devam edin başlamadıysanız başlayın başaracağınıza inanın. 🙂

Sosyal Ağlarda Paylaş

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.