Salı, Temmuz 08, 2008

C# BASICS: Boxing ve Unboxing



C# dilinde boxing ve unboxing çok basit gibi görünen fakat çok önemli bir yer tutan kavramlardır. C# dilinde temel tipleri deger tipleri(value types ) ve referans tipleri(reference types) olarak iki tiptir ve bu tiplerin bellekte saklanma şekilleri farklılık gösterir. Bu konudaki en önemli nokta da işte bu bellek bölgeleridir. Bellek bölgeleri Stack(yığın) ve Heap(öbek ) olarak iki kısımdır. Değer tipi değişkenler belleğin stack alanında bulunurlar. Değer tipi değişkenler bool, int, char, double, sbyte, byte, short, decimal, struct, uint, enum, ulong, float, ushort tipleridir. Referans tipleri ise class, interface, delegate, object tipleridir.Şimdi c# da herşey bir nesnedir veya objectir diyoruz da bir integer veri tipi nereden türetilmiştir diye akıllara bir soru gelebilir. Cevap structlarda gizlidir. Structlar anlatılırkenc# da classlar varken structlara neden ihtiyaç duyulduğu gibi bir soru akıllara gelir ve ardından hemen cevap olarak structların stack bölgesinde saklandığı ve stack bölgesine heap bölgesinde saklanan verilere göre daha hızlı erişim sağlanacağıdır. İlk sorunun cevabı da değer tiplerinin (int gibi) aslında birer struct olduğudur.Değer tipleri stack alanında tutulurlar fakat referans tipleri stack alanında (C dilindeki işaretçilere benzetebiliriz) bir referans bulundururlar ve asıl değerler heap alanında saklanırlar. İşlem yapılacağı zaman referans türünün işaret ettiği heap bölgesinden veri aktarılır.






Boxing ve Unboxing işlemleri de bu arada devreye giriyor. Boxing bir değer türünden bir değişkeni referans türünden nesneye aktarmaktır. Unboxing işlemi ise referans türünden bir nesnenin işaret ettiği değeri, değer türünden bir değişkene aktarmaktır.Tabiki değer ve referans tipleri arasındaki fark bu tiplerin ya da referansların işleri bitiğinde belleğin serbest bırakılması sırasında da olrata çıkıyor. Değer tipleri otomatik olarak belleğe geri verilirken referans türlerinin geri kazandırılmasında stact bölgesindeki referans ya da başvuru otomatik olarak belleğe kazandırılırken heap bölgesindeki veriler Garbage Collection mekanizması ile kazanılır.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BoxingAndUnboxing
{
class Program
{
static void Main(string[] args)
{
int sayi = 31111;
object obj;
obj = sayi;
//Boxing işlemi...
Console.WriteLine("Sayi: {0} obj : {1}", sayi, obj);
}}}
Burada boxing işlemi otomatik olarak yapılır ve integer degerinde bir object referans tipi oluşturulur. Unboxing işlemi ise boxing işlemi gibi otomatik yapılmaz ve programcının unboxing işlemi sırasında dikkatli olması gerekir. Çünkü her zaman tipler arasında dönüşüm yapılamayabilir. Dikkatsiz unboxing işlemlerinde veri kayıpları olabilir ve exception fırlatılır.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BoxingAndUnboxing
{
class Program
{
static void Main(string[] args)
{
int sayi = 31111;object obj;obj = sayi;
//Boxing işlemi...
Console.WriteLine("Sayi: {0} obj : {1}", sayi, obj);int sayi2;sayi2 = (int)obj;
// Unboxing İşlemi...
Console.WriteLine("Sayi2 : {0}", sayi2);
}}}

0 yorum:

Yorum Gönder