Skip to content

Boxing ve Unboxing

Genel Bakış

Boxing ve Unboxing, C#'ta value type'ların reference type'lara dönüştürülmesi ve tekrar value type'lara dönüştürülmesi işlemleridir. Bu işlemler performans açısından önemli etkilere sahiptir.

Boxing (Kutulama)

  1. Temel Boxing

    // Value type -> object (boxing)
    int number = 42;
    object boxed = number; // Boxing işlemi
    

  2. Boxing Örnekleri

    // Sayısal tipler
    double pi = 3.14;
    object boxedPi = pi;
    
    // Struct'lar
    DateTime now = DateTime.Now;
    object boxedNow = now;
    
    // Enum'lar
    DayOfWeek day = DayOfWeek.Monday;
    object boxedDay = day;
    

  3. Boxing ve Interface

    // Value type -> interface (boxing)
    IComparable comparable = 42; // Boxing
    

Unboxing (Kutudan Çıkarma)

  1. Temel Unboxing

    // object -> value type (unboxing)
    object boxed = 42;
    int number = (int)boxed; // Unboxing işlemi
    

  2. Unboxing Örnekleri

    // Sayısal tipler
    object boxedNumber = 42;
    int number = (int)boxedNumber;
    
    // Struct'lar
    object boxedDate = DateTime.Now;
    DateTime date = (DateTime)boxedDate;
    
    // Enum'lar
    object boxedEnum = DayOfWeek.Monday;
    DayOfWeek day = (DayOfWeek)boxedEnum;
    

  3. Unboxing ve Interface

    // Interface -> value type (unboxing)
    IComparable comparable = 42;
    int number = (int)comparable;
    

Boxing/Unboxing Performans Etkileri

  1. Bellek Kullanımı

    // Boxing öncesi
    int number = 42; // 4 byte
    
    // Boxing sonrası
    object boxed = number; // 4 byte (değer) + 8 byte (object header) + 4 byte (type pointer)
    

  2. Performans Ölçümü

    // Boxing olmadan
    int sum = 0;
    for (int i = 0; i < 1000000; i++)
    {
        sum += i;
    }
    
    // Boxing ile
    object sum = 0;
    for (int i = 0; i < 1000000; i++)
    {
        sum = (int)sum + i; // Boxing ve unboxing
    }
    

Boxing/Unboxing Önleme Yöntemleri

  1. Generic Kullanımı

    // Boxing olmadan
    public class GenericList<T>
    {
        private T[] items;
        // ...
    }
    
    // Boxing ile
    public class ObjectList
    {
        private object[] items;
        // ...
    }
    

  2. Interface Kullanımı

    // Boxing olmadan
    public interface IValueContainer<T>
    {
        T Value { get; }
    }
    
    // Boxing ile
    public interface IValueContainer
    {
        object Value { get; }
    }
    

  3. Struct Kullanımı

    // Boxing olmadan
    public struct Point
    {
        public int X { get; }
        public int Y { get; }
    }
    
    // Boxing ile
    public class Point
    {
        public int X { get; }
        public int Y { get; }
    }
    

Boxing/Unboxing ve Collections

  1. Generic Collections

    // Boxing olmadan
    List<int> numbers = new List<int>();
    numbers.Add(42);
    
    // Boxing ile
    ArrayList numbers = new ArrayList();
    numbers.Add(42); // Boxing
    

  2. Dictionary Kullanımı

    // Boxing olmadan
    Dictionary<int, string> dict = new Dictionary<int, string>();
    dict[42] = "Answer";
    
    // Boxing ile
    Hashtable dict = new Hashtable();
    dict[42] = "Answer"; // Boxing
    

Boxing/Unboxing ve LINQ

  1. LINQ Sorguları

    // Boxing olmadan
    var numbers = new List<int> { 1, 2, 3 };
    var sum = numbers.Sum(); // No boxing
    
    // Boxing ile
    var objects = new ArrayList { 1, 2, 3 };
    var sum = objects.Cast<int>().Sum(); // Boxing
    

  2. LINQ ve Value Types

    // Boxing olmadan
    var points = new List<Point>();
    var xSum = points.Sum(p => p.X);
    
    // Boxing ile
    var points = new ArrayList();
    var xSum = points.Cast<Point>().Sum(p => p.X); // Boxing
    

Mülakat Soruları

  1. Boxing/Unboxing Temelleri
  2. Boxing ve Unboxing nedir?
  3. Hangi durumlarda boxing/unboxing gerçekleşir?
  4. Boxing/unboxing'in performans etkileri nelerdir?

  5. Bellek Yönetimi

  6. Boxing işlemi bellekte nasıl gerçekleşir?
  7. Boxing sonrası oluşan nesne nerede saklanır?
  8. Boxing/unboxing'in garbage collection üzerindeki etkisi nedir?

  9. Performans Optimizasyonu

  10. Boxing/unboxing nasıl önlenebilir?
  11. Generic tipler boxing/unboxing'i nasıl önler?
  12. Value type'ların performans optimizasyonu nasıl yapılır?

  13. Collections ve Boxing

  14. Generic collections boxing/unboxing'i nasıl önler?
  15. ArrayList vs List performans farkları nelerdir?
  16. Dictionary vs Hashtable boxing/unboxing açısından farkları nelerdir?

  17. LINQ ve Boxing

  18. LINQ sorgularında boxing/unboxing nasıl önlenir?
  19. LINQ ve value type'ların kullanımında dikkat edilmesi gerekenler nelerdir?
  20. LINQ performans optimizasyonu nasıl yapılır?

  21. Interface ve Boxing

  22. Interface'ler boxing/unboxing'i nasıl etkiler?
  23. Generic interface'ler boxing/unboxing'i nasıl önler?
  24. Interface kullanımında performans optimizasyonu nasıl yapılır?

  25. Struct ve Boxing

  26. Struct'lar boxing/unboxing'i nasıl etkiler?
  27. Immutable struct'lar boxing/unboxing'i nasıl etkiler?
  28. Struct kullanımında performans optimizasyonu nasıl yapılır?

  29. Modern C# Özellikleri

  30. C# 7.0 ve sonrasında boxing/unboxing nasıl gelişti?
  31. ref struct ve readonly struct boxing/unboxing'i nasıl etkiler?
  32. Modern C# özellikleri boxing/unboxing'i nasıl optimize eder?

Örnek Kod Soruları

  1. Boxing Önleyici Generic Sınıf

    public class ValueContainer<T> where T : struct
    {
        // Implementasyon
    }
    

  2. Boxing Önleyici Collection

    public class ValueCollection<T> where T : struct
    {
        // Implementasyon
    }
    

  3. Boxing Önleyici Cache

    public class ValueCache<TKey, TValue> where TValue : struct
    {
        // Implementasyon
    }
    

  4. Boxing Önleyici LINQ Extension

    public static class ValueTypeExtensions
    {
        // Implementasyon
    }
    

  5. Boxing Önleyici Serializer

    public class ValueTypeSerializer<T> where T : struct
    {
        // Implementasyon
    }
    

Kaynaklar