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)¶
-
Temel Boxing
// Value type -> object (boxing) int number = 42; object boxed = number; // Boxing işlemi
-
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;
-
Boxing ve Interface
// Value type -> interface (boxing) IComparable comparable = 42; // Boxing
Unboxing (Kutudan Çıkarma)¶
-
Temel Unboxing
// object -> value type (unboxing) object boxed = 42; int number = (int)boxed; // Unboxing işlemi
-
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;
-
Unboxing ve Interface
// Interface -> value type (unboxing) IComparable comparable = 42; int number = (int)comparable;
Boxing/Unboxing Performans Etkileri¶
-
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)
-
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¶
-
Generic Kullanımı
// Boxing olmadan public class GenericList<T> { private T[] items; // ... } // Boxing ile public class ObjectList { private object[] items; // ... }
-
Interface Kullanımı
// Boxing olmadan public interface IValueContainer<T> { T Value { get; } } // Boxing ile public interface IValueContainer { object Value { get; } }
-
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¶
-
Generic Collections
// Boxing olmadan List<int> numbers = new List<int>(); numbers.Add(42); // Boxing ile ArrayList numbers = new ArrayList(); numbers.Add(42); // Boxing
-
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¶
-
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
-
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ı¶
- Boxing/Unboxing Temelleri
- Boxing ve Unboxing nedir?
- Hangi durumlarda boxing/unboxing gerçekleşir?
-
Boxing/unboxing'in performans etkileri nelerdir?
-
Bellek Yönetimi
- Boxing işlemi bellekte nasıl gerçekleşir?
- Boxing sonrası oluşan nesne nerede saklanır?
-
Boxing/unboxing'in garbage collection üzerindeki etkisi nedir?
-
Performans Optimizasyonu
- Boxing/unboxing nasıl önlenebilir?
- Generic tipler boxing/unboxing'i nasıl önler?
-
Value type'ların performans optimizasyonu nasıl yapılır?
-
Collections ve Boxing
- Generic collections boxing/unboxing'i nasıl önler?
- ArrayList vs List
performans farkları nelerdir? -
Dictionary vs Hashtable boxing/unboxing açısından farkları nelerdir?
-
LINQ ve Boxing
- LINQ sorgularında boxing/unboxing nasıl önlenir?
- LINQ ve value type'ların kullanımında dikkat edilmesi gerekenler nelerdir?
-
LINQ performans optimizasyonu nasıl yapılır?
-
Interface ve Boxing
- Interface'ler boxing/unboxing'i nasıl etkiler?
- Generic interface'ler boxing/unboxing'i nasıl önler?
-
Interface kullanımında performans optimizasyonu nasıl yapılır?
-
Struct ve Boxing
- Struct'lar boxing/unboxing'i nasıl etkiler?
- Immutable struct'lar boxing/unboxing'i nasıl etkiler?
-
Struct kullanımında performans optimizasyonu nasıl yapılır?
-
Modern C# Özellikleri
- C# 7.0 ve sonrasında boxing/unboxing nasıl gelişti?
- ref struct ve readonly struct boxing/unboxing'i nasıl etkiler?
- Modern C# özellikleri boxing/unboxing'i nasıl optimize eder?
Örnek Kod Soruları¶
-
Boxing Önleyici Generic Sınıf
public class ValueContainer<T> where T : struct { // Implementasyon }
-
Boxing Önleyici Collection
public class ValueCollection<T> where T : struct { // Implementasyon }
-
Boxing Önleyici Cache
public class ValueCache<TKey, TValue> where TValue : struct { // Implementasyon }
-
Boxing Önleyici LINQ Extension
public static class ValueTypeExtensions { // Implementasyon }
-
Boxing Önleyici Serializer
public class ValueTypeSerializer<T> where T : struct { // Implementasyon }