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 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 ;
0 thoughts on “C# Boxing ve Unboxing”