Boxing Ve Unboxing Kavramı Nedir ? C#
Bir değer tipinin, referans tipine dönüştürme işlemine C#’ta boxing(kutulama) denir . Referans tipinin tekrar değer tipine dünüştürme işlemine ise C#’ta unboxing(kutudan çıkartma) denir.
Bildiğiniz üzere object bir referans türündedir. Bu yüzden boxing işlemini aşağıdaki gibi yapabiliriz.
string mesaj;
object boxing;
mesaj = "1.Mesaj";
boxing = mesaj;
Referans tipini tekrar değer tipine(unboxing) çevirme işlemi için de için de ;
string yeni = (string)boxing;
C#’ta boxing yapmak, özellikle sık sık veya döngüler halinde yapıldığında performansı kötü etkiler. Bunun nedeni, boxing işlemi heap üzerinde bir nesne oluşturur. Ve değer türünün değerini o nesneye kopyalar.
Bu, fazlaca bellek tahsisine neden olmaktadır. Ve ayrıca garbage collector ın belleği geri kazandırmak için daha fazla çalışmasına sebep olur.
Ek olarak, boxing işlemi uygulanmış bir değer kullanılırsa, CLR’nin değerin kutusunu açmak için ekstra çalışma yapması gerekmektedir. Bu, nesnenin türünün kontrol edilmesini gerektirir. Değerin çıkarılmasını ve ardından değerin uygun yönteme veya işleme aktarılmasını içerir. Bu ekstra çalışma aynı zamanda performansı da yavaşlatmaktadır.
Bu nedenle, performans açısından kritik kodlarda kullanmak pek önerilen bir durum değildir. Özellikle de sık sık veya döngüler halinde yapılıyorsa, genellikle boxing işleminden kaçınılması önerilmektedir. Bunun yerine genel koleksiyonları veya değer türlerini doğrudan kullanmayı düşünebilirsiniz; bunlar, kutulama ve kutudan çıkarma ihtiyacını ortadan kaldırarak performansı artırmaya yardımcı olabilir.
Unboxing işlemi gerçekleştirilirken boxing işleminde kullanılan veri tipinin aynısı kullanıldığına dikkat etmek gerekir. Aksi halde veri tipleri uyuşmayacağından InvalidCastException hatası alınacaktır.
Daha detaylı bilgi için microsoftun kendi yayınladığı makaleye bakabilirsiniz.
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing