Boxing and UnBoxing in .Net Applications

سأحاول في هذا المقال توضيح مفهوم الـ Boxing و الـ UnBoxing في برامج الـ .NET والذي كان قد تطرق إليه محمد نسمان في أحد مقالاته الـ Boxingهو عندما نقوم بالتحويل من الـ Value Type إلى Reference Type لا أدري إن كان يصح ترجمتها (التحويل من قيمة إلى مرجعية)، أما الـ UnBoxing فهي عندما نقوم بالتحويل من Reference Type إلى Value Type . وطبعاً هذا أمر متاح في بيئة الـ .NET بشكل مباشر وعن طريق الاسناد للتوضيح أكثر في بيئة الـ .NET هناك مجموعتين من (الأنواع) Types الأولى Value Type (نوع قيمة) والثانية Reference Type (نوع مرجعية). Value Type : هي تابعة للصف System.ValueType وهي (numeric, Boolean, Char, enumerations, structures "Records") وهي تحجز ضمن المكدس Stack و هذا مشابه لبيئة الـ Win32. Reference Type : هي تابعة للصف System.Object وهي عبارة عن مؤشر Pointer إلى بيانات في الكومة Heap وهي تدار أو تحذف في النهاية من قبل مجمع النفايات framework's garbage collector تماماً مثل Java و هي هنا تتميز عن بيئة الـ Win32 التي تحتاج لتدخل المبرمج لحذف ما كان قد أنشأه من أغراض عند الانتهاء منها. و الـ Reference Type في بيئة الـ .NET هي (string, arrays, classes, delegates) الـ Boxing و الـ UnBoxing تحدث بشكل تلقائي في برامج الـ C# أما في برامج Delphi .Net فهناك Directive جديد هو $AUTOBOX وهو يكون Off بشكل افتراضي لذلك يجب أن نستخدمه بشكل On الآن لننتقل إلى مثال قد يوضح المسألة لنبدأ مشروع .Net من النوع Console ولنكتب الكود التالي :

program Project1; {$APPTYPE CONSOLE} {$AUTOBOX ON} uses SysUtils; var i : integer; o : System.Object; begin i := 100; o := i; // Boxing Writeln(o); Readln; end.

هذا المثال يوضح عملية الـ Boxing و لمزيد من التوضيح يمكننا استخدام أداة ILDASM التي تأتي مع الـ .Net Framework و يمكن أن تجدها ضمن مجلد Program Files\Microsoft.NET\SDK\v1.1\Bin -يمكن أن يكون V2.0 حسب الاصدار- نقوم بفتح الملف التنفيذي للبرنامج السابق Project1.exe لنرى النص المصدري للبرنامج بلغة الآسمبلي ولنشاهد السطر الذي يشير إلى عملية الـ Boxing كما في الصورة التالية الآن نفس الشيء يمكن تنفيذه في C# من خلال لكود التالي:

static void Main(string[] args) { int i = 100; object o = i; //Boxing System.Console.WriteLine(o); }

الآن لننتقل إلى موضوع الـ UnBoxing نضيف متحول جديد من النوع Integer ونعدل الكود كما يلي :

program Project1; {$APPTYPE CONSOLE} {$AUTOBOX ON} uses SysUtils; var i,J : integer; o : System.Object; begin i := 100; o := i; // Boxing Writeln(o); J := Integer (o); // UnBoxing Writeln(j); Readln; end.

نعيد فتح الملف التنفيذي ضمن ILDASM لنرى النتيجة أتمنى أن أكون قد أوضحت هذين المفهومين الهامين و إلى لقاء جديد.

Articles Categories: 

إضافة تعليق جديد