Photo by Kelli McClintock on Unsplash

Boxing vs Unboxing

Furkan Güngör
FowApps
Published in
2 min readJul 26, 2022

--

Kutulamak ve kutuyu kaldırmak. İşte bütün mesele bu. 😇

Value type ve referance type olaraka ikiye ayırdığımız veri tipleri bazen stack bazen ise heap üzerinde tutulmaktadır. Value tipler stack üzerinde saklanırken referans tipler heap üzerinde saklanmaktadır ancak stack üzerinde de bir başvuru bulundurduğunu unutmamak gerekiyor.

Temel kısa bir özet yaptıktan sonra artık bu iki kavramı daha iyi anlayabiliriz.

Boxing value tipinde olan bir değişkeni referans tipinde bir nesneye aktarma işlemini tanımlar.

Unboxing işlemi ise tam tersi bir işlem yürütür. Yani referans tipindeki bir nesnenin işaret ettiği değeri bir value tipine aktarma işlemini tanımlar.

Boxing ve Unboxing işlemlerinde odak noktamız bellekte verilerin tutulma şeklidir. Bu işlemler gerçekleştirilirken bellekte tutulan nesnelerin tutulma yöntemi de değiştiği için maliyetli bir olay olduğu söylenir.

Bu yazıda bu söylentinin doğru olup olmadığını ve performans karşılaştırmalarını yapmaya çalışacağım.

C# üzerinde günlük hayatta kullandığımız pre-defined olan yapılarda da boxing ve unboxing operasyonlarının olduğunu söyleyebiliriz.

IList<T> ve List<T> yapıları bu örnek için oldukça uygundur.

List<T> kullandığımızda herhangi bir boxing uygulanmadan bir Enumerator<T> elde etmiş oluruz. Ancak IList<T> kullandığımızda IEnumerator<T> tipinde boxing uygulanmış bir değişken elde etmiş oluruz.

BenchmarkDotnet kütüphanesinin yardımıyla bir test gerçekleştirdiğimizde sonuçlar aşağıdaki gibi olacaktır.

Başka bir örnek vermek gerekirse LINQ yapısı ele alınabilir. LINQ query yapısı IEnumerable<T> üzerinde çalışır bu sebeple bir value tipini LINQ üzerinde işletmek yine Boxing işlemini sebep olacaktır.

Boxing ve Unboxing işlemleri maliyetlidir. Teknik dökümanlara göre Boxing işlemi normal bir atama işleminden 40 kat fazla maliyet oluşturabilir. Yine Unboxing işlemleri de 4 kat fazla maliyet oluşturabilir.

Özellikle LINQ sorgularında daha performanslı olmak için code base üzerinde bu tarz değişiklikler yapılabilir. Ancak performans testlerinde de ortaya çıkan sonuçlar doğrultusunda gözle görülebilen bir performans artışı olmayacaktır. Çünkü bahsettiğimiz bu birimler oldukça küçük birimlerdir.

Önemli olan Boxing ve Unboxing işlemleri gerçekleştiğinde verilerin tutulma şeklinin nasıl değiştiğini anlayabilmek. Ayrıca verilerin tutulma şekli değişirken gerçekleşen işlemlerin maliyeti nasıl etkilediğini tahmin edebilmektir.

Yazdığınız kodlar production ortamında hatasız çalışsın. Testler sizi korusun. 🙏

.NET Performance Tips — .NET Framework | Microsoft Docs

Boxing and Unboxing — C# Programming Guide | Microsoft Docs

Difference between Boxing and Unboxing in C# (tutorialspoint.com)

Difference between Boxing and Unboxing in C# — GeeksforGeeks

Boxing/Unboxing — Tips and tricks (linkdotnet.github.io)

--

--

Furkan Güngör
FowApps
Editor for

Solution Developer — I want to change the world, give me the source code.