0Pricing
C# Academy · درس

التغليف وفك التغليف

افهموا تكلفة التحويل إلى object

التغليف وفك التغليف درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

ما المقصود بـ Boxing؟

يغلّف Boxing نوع قيمة داخل كائن، بحيث يمكن التعامل معه كنوع مرجع. ويؤدي object o = 5; إلى وضع قيمة int داخل كائن في الكومة.

using System;

class Program
{
    static void Main()
    {
        int n = 5;
        object o = n;   // boxing
        Console.WriteLine("Boxed value: " + o);
    }
}

متى يحدث Boxing؟

يحدث Boxing كلما أُسند نوع قيمة إلى متغير من النوع object (أو إلى واجهة). يخصّص وقت التشغيل حاوية في الكومة تحتوي على نسخة من القيمة.

using System;

class Program
{
    static void Main()
    {
        double d = 3.14;
        object boxed = d;   // boxing copies d into a heap object
        Console.WriteLine(boxed);
    }
}

ما المقصود بـ Unboxing؟

يستخرج Unboxing نوع القيمة من الحاوية باستخدام تحويل صريح. ويجب أن يطابق نوع التحويل النوع الذي غُلّفت به القيمة تمامًا.

using System;

class Program
{
    static void Main()
    {
        object o = 42;        // boxing
        int n = (int)o;        // unboxing
        Console.WriteLine("Unboxed: " + n);
    }
}

يتطلب Unboxing النوع الصحيح

يجب إجراء Unboxing إلى النوع الأصلي نفسه تمامًا. ويؤدي إجراء Unboxing إلى نوع مختلف إلى طرح الاستثناء InvalidCastException.

using System;

class Program
{
    static void Main()
    {
        object o = 100;
        try
        {
            long wrong = (long)o;   // InvalidCastException at runtime
            Console.WriteLine(wrong);
        }
        catch (InvalidCastException)
        {
            Console.WriteLine("Must unbox to int, not long");
        }
    }
}

ينشئ Boxing نسخة

ينسخ Boxing القيمة. لذلك لا يؤدي تغيير القيمة الأصلية لاحقًا إلى تغيير النسخة المغلّفة.

using System;

class Program
{
    static void Main()
    {
        int n = 1;
        object o = n;   // box copies 1
        n = 99;
        Console.WriteLine("original=" + n + ", boxed=" + o);
    }
}

تكلفة Boxing

يخصّص كل Boxing ذاكرة في الكومة ويزيد الضغط على جامع البيانات المهملة. وفي الحلقات التي تُنفّذ بكثافة، قد يؤثر هذا الحمل في الأداء بشكل ملحوظ.

using System;

class Program
{
    static void Main()
    {
        // Each iteration boxes an int -> many heap allocations
        object sumBox = 0;
        for (int i = 0; i < 5; i++)
        {
            int current = (int)sumBox + i;
            sumBox = current;   // box again
        }
        Console.WriteLine("Result: " + sumBox);
    }
}

تجنّب Boxing باستخدام Generics

تخزّن المجموعات العامة مثل List<int> أنواع القيم من دون Boxing، بخلاف ArrayList القديمة غير العامة.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var list = new List<int>();   // no boxing
        list.Add(1);
        list.Add(2);
        int first = list[0];           // no unboxing
        Console.WriteLine("First: " + first);
    }
}

Boxing مع الواجهات

يؤدي إسناد بنية إلى متغير واجهة إلى Boxing لها أيضًا، لأن مرجع الواجهة يجب أن يشير إلى كائن في الكومة.

using System;

class Program
{
    static void Main()
    {
        int n = 7;
        IComparable c = n;   // boxing to interface
        Console.WriteLine(c.CompareTo(10));
    }
}

اكتشاف الأنواع المغلّفة

يمكنكم التحقق من نوع كائن مغلّف أثناء التشغيل باستخدام is قبل إجراء Unboxing بأمان.

using System;

class Program
{
    static void Main()
    {
        object o = 3.5;
        if (o is double d)
            Console.WriteLine("It is a double: " + d);
        else
            Console.WriteLine("Not a double");
    }
}

Boxing عند دمج السلاسل النصية

قد يؤدي دمج نوع قيمة مع سلاسل نصية إلى Boxing له. وغالبًا ما يكون استخدام الاستيفاء النصي أو ToString أوضح، مع أن تكلفة Boxing هنا تكون عادةً ضئيلة.

using System;

class Program
{
    static void Main()
    {
        int count = 3;
        string msg = "Count is " + count;   // count is converted
        Console.WriteLine(msg);
    }
}

جمع المفاهيم

يربط Boxing بين عالمي القيم والمراجع، لكنه يتطلب عمليات تخصيص. لذلك يُفضّل استخدام Generics لتجنّبه، وإجراء Unboxing إلى النوع المطابق تمامًا بعد التحقق بأمان.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        object boxed = 256;
        if (boxed is int value)
            Console.WriteLine("Safely unboxed: " + value);

        var noBox = new List<int> { 1, 2, 3 };
        Console.WriteLine("Generic count: " + noBox.Count);
    }
}

اختبار سريع

اختبروا مدى فهمكم لـ Boxing وUnboxing.

مراجعة

يغلّف Boxing نوع قيمة داخل كائن في الكومة (مثل object o = 5;)، بينما يستخرج Unboxing القيمة باستخدام تحويل صريح إلى النوع الأصلي المطابق تمامًا. ينسخ Boxing القيمة ويخصّص ذاكرة، مما يزيد الضغط على جامع البيانات المهملة. ويُفضّل استخدام المجموعات العامة مثل List<int> لتجنّب Boxing، واستخدام is لإجراء Unboxing بأمان.

using System;

class Program
{
    static void Main()
    {
        object boxed = 42;     // box
        int n = (int)boxed;     // unbox
        Console.WriteLine(n);
    }
}

الأسئلة الشائعة

هل درس «التغليف وفك التغليف» مجاني؟

نعم — نص درس «التغليف وفك التغليف» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «التغليف وفك التغليف»؟

افهموا تكلفة التحويل إلى object تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «التغليف وفك التغليف»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أنواع القيم مقابل أنواع المراجع
  2. التغليف وفك التغليف
  3. التحويلات الضمنية والصريحة
  4. الفئة Convert والتحليل
← العودة إلى C# Academy