التحويل إلى كائن والتحويل إلى نوع القيمة (دليل البرمجة لـ C#)

التحويل إلى كائن هي عملية تحويل نوع القيمة إلى النوع object أو إلى أي نوع واجهة تم تطبيقه بواسطة نوع القيمة. عندما يقوم CLR بتحويل نوع القيمة إلى كائن فإنه يلف القيمة التي تكون داخل System.Object ويخزنها في كومة الذاكرة المؤقتة المدارة. التحويل إلى نوع القيمة هي عملية استخراج نوع القيمة من الكائن. في المثال التالي تم تحويل المتغير من نوع عدد صحيح i إلى كائن وتم تعيينه للكائن o.

int i = 123;
object o = (object)i;  // boxing

يمكن إذاً تحويل الكائن o إلى نوع القيمة وتعيينه للعدد الصحيح i:

o = 123;
i = (int)o;  // unboxing

الأداء

بالنسبة إلى التعيينات البسيطة، التحويل إلى كائن والتحويل إلى نوع القيمة عبارة عن عمليات حسابية مكلفة. عندما نقوم بتحويل نوع القيمة إلى كائن، يجب تخصيص وإنشاء كائن جديد. إلى درجة أقل العمل المطلوبة للتحويل إلى نوع القيمة أيضاً مكلف حسابياً. لمزيد من المعلومات، راجع الأداء.

التحويل إلى الكائن

يتم استخدام "التحويل إلى كائن" لتخزين أنواع القيم في كومة تجميع البيانات المهملة. التحويل إلى كائن هي عملية تحويل نوع القيمة إلى النوع object أو إلى أي نوع واجهة تم تطبيقه بواسطة نوع القيمة. تحويل نوع قيمة إلى كائن يحجز مثيل كائن في كومة الذاكرة المؤقتة وينسخ القيمة للكائن الجديد.

خذ بعين الاعتبار التعريف التالي لمتغير نوع القيمة:

int i = 123;

العبارة التالية تقوم ضمنيا بتطبيق عملية "التحويل إلى كائن" على المتغير i:

object o = i;  // Implicit boxing

نتيجة هذه العبارة هي إنشاء مرجع للكائن o في المكدس ويشير المرجع إلى قيمة من النوع int على كومة الذاكرة المؤقتة. هذه القيمة عبارة عن نسخة من قيمة نوع القيمة التي تم تعيينها إلى المتغير i. يتم توضيح الفرق بين المتغيران i و o في الشكل التالي.

طريقة التحويل إلى كائن

الرسم BoxingConversion

يمكن أيضاً أن نقوم بتنفيذ عملية التحويل إلى كائن تنفيذاً صريحاً كما في المثال التالي، ولكنه غير مطلوب أبداً:

int i = 123;
object o = (object)i;  // explicit boxing

الوصف

يحول هذا المثال متغير من نوع عدد صحيح i إلى كائن o باستخدام عملية "التحويل إلى كائن". ثم إن القيمة المخزنة في المتغير i تم تغييرها من 123 إلى 456. يُظهر المثال أن نوع القيمة الأصلية والكائن الذي تم تحويله يستخدمان مواقع ذاكرة منفصلة وبالتالي يمكن تخزين قيم مختلفة.

مثال

class TestBoxing
{
    static void Main()
    {
        int i = 123;
        object o = i;  // Implicit boxing

        i = 456;  // Change the contents of i

        System.Console.WriteLine("The value-type value = {0}", i);
        System.Console.WriteLine("The object-type value = {0}", o);
    }
}
/* Output:
    The value-type value = 456
    The object-type value = 123
*/

يوضح المثال التالي حالة غير صالحة من التحويل إلى نوع القيمة و الناتج هو InvalidCastException. باستخدامtry و catch، يتم عرض رسالة خطأ عند حدوث الخطأ.

class TestUnboxing
{
    static void Main()
    {
        int i = 123;
        object o = i;  // implicit boxing

        try
        {
            int j = (short)o;  // attempt to unbox

            System.Console.WriteLine("Unboxing OK.");
        }
        catch (System.InvalidCastException e)
        {
            System.Console.WriteLine("{0} Error: Incorrect unboxing.", e.Message);
        }
    }
}

هذا البرنامج يخرج:

Specified cast is not valid. Error: Incorrect unboxing.

إذا قمت بتغيير العبارة:

int j = (short) o;

إلى:

int j = (int) o;

سيتم تنفيذ التحويل و سوف تحصل على المخرجات:

Unboxing OK.

التحويل إلى نوع القيمة

"التحويل إلى نوع القيمة" هي عملية تحويل من نوع object إلى نوع القيمة أو من نوع واجهة إلى نوع قيمة التي تقوم بتنفيذ الواجهة. تتكون عملية "التحويل إلى نوع القيمة" من:

  • التحقق من مثيل الكائن حتى يتم التأكد من أنه قيمة تم تحويلها إلى كائن من نوع القيمة المعطاة.

  • نسخ القيمة من المثيل إلى متغير نوع القيمة.

تشرح العبارات التالية عمليتي "التحويل إلى كائن" و"التحويل إلى نوع القيمة":

int i = 123;      // a value type
object o = i;     // boxing
int j = (int)o;  // unboxing

يوضح الرسم التوضيحي التالي نتيجة العبارات السابقة.

طريقة التحويل إلى نوع القيمة

الرسم تحويل UnBoxing

لكي تنجح عملية "التحويل إلى نوع القيمة" في وقت التشغيل، يجب أن يكون العنصر الذي يتم تحويله إلى نوع القيمة عبارة عن مرجع إلى كائن تم إنشاؤه مسبقًا من قبل التحويل إلى كائن لمثيل نوع القيمة. محاولة تحويل الـ null إلى نوع القيمة يتسبب في NullReferenceException. محاولة إجراء عملية "التحويل إلى نوع القيمة" لنوع قيمة غير متوافق يتسبب في InvalidCastException.

مواصفات لغة #C

لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.

الأقسام ذات الصلة

لمزيد من المعلومات:

مواصفات لغة #C

لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.

راجع أيضًا:

المبادئ

دليل البرمجة لـ #C