تكرار السؤال: …
الإجابة المختصرة
Boxing هو تحويل Value Type إلى كائن object في الـ Heap مع حجز ذاكرة إضافي، وUnboxing هو استخراج القيمة الأصلية؛ وتكرارهما يرهق الـ Garbage Collector ويبطئ الأداء.
الشرح
عند إسناد قيمة بدائية مثل int إلى متغير من نوع object أو واجهة interface، يضطر الـ CLR لتخصيص كائن جديد في الـ Heap ونسخ القيمة بداخله (Boxing). وعند استرجاعها كـ (int)obj، يتم فحص النوع ونسخ القيمة مجدداً (Unboxing). استخدام الـ Generics (مثل List<int> بدلاً من ArrayList القديمة) يقضي تماماً على هذه التكلفة.
مثال بالكود
int val = 42;
object boxed = val; // Boxing: حجز كائن جديد في الـ Heap
int unboxed = (int)boxed; // Unboxing: فحص النوع واستخراج القيمةأخطاء شائعة
- استخدام واجهات غير عامة مثل IList غير الجنيس مع آلاف القيم الرقمية مما يولد ملايين عمليات الـ Boxing غير الضرورية.