أهلا بكم في عالمي


بعض المفاهيم في .NET

اشتريت مؤخرا كتابا يتحدث عن برمجة .NET Compact Framework , و بدأت القراءة فيه
و كان الجزء الأول من الكتاب يتحدث عن مفاهيم .NET Framework و ألية عمله و تصميمه
بعض مميزات المترجمات للغات الدوت نت
سأحاول أن أشارككم ببعض النقاط المهمة من هذا الكتاب

private void SayHello()
{
string str1 = “Hello”;
StringBuilder sb1 = new StringBuilder(“Hello”);
MessageBox.Show(“Hello”, “Hello”);
}

في المثال السابق نلاحظ أن كلمة Hello قد تكررت أربع مرات فهل يتم حفظ أربع كلمات Hello
في التطبيق الذي أنشأناه , فعليا لا يتم ذلك بل يقوم المترجم بإضافة اربع مؤشرات تدل لعبارة Hello واحدة
و بالتالي سيكون حجم الملف التنفيذي أصغر مما كان ممكنا أن يكون لو تم تخزين أربع كلمات “Hello”

نتحدث عن الانواع القياسية للبيانات في .NET :
هناك نوعان قياسيان :
Value Types : و هي انواع بسيطة معدة لتخزن بيانات مجردة
أمثلة على Value Types :

Integers

Floating-point numbers

Data structures

Enumerations

الهدف من Value Types ان تكون صغيرة و سريعة , و عندما تستخدم كمتحولات محلية
فإنها تتوضع في المكدس Stack , و عندما تحتوى في object فإنها تمثل على شكل stream بسيط من البايتات

كل الـ value types تتفرع عن صنف اساسي هو System.ValueType
و هذا الصنف يتفرع بدوره عن System.Object
الـ value types لها محدودياتها أيضا , فبينما تعرف على أنها أصناف .NET , فإنها بحد
ذاتها تعتبر أصنافا مغلقة , أو بعبارة أخرى لا يمكنك ان تستخدم System.Int32 (او اي value-type class أخر)
كصنف رئيسي (base class ) لأنواع أخرى
ايضا المتحولات من نوع value-type يجب ان تحتوي دوما على قيمة ما و يجب ألا تكون فارغة

Reference Types

أغراض الـ Reference Types يمكن الوصول لها في زمن التنفيذ باستخدام مرجع (Reference )
هو مؤشر للغرض بحد ذاته .

أمثلة على reference types :
Objects created from a class

Objects encapsulating Win32 system objects (forms, controls, graphic objects, threads, mutexes, files, and so on)

Arrays

Strings

كل غرض (object ) يمتلك ترويسة غرض قياسية (standard object header)
حجم ترويسة الغرض هو 8 بايت
و الحجم لأصغر غرض ممكن هو 12 بايت
و بالتالي فإن reference types تأخذ مساحة أكبر مما تأخذه value types

Reference types تمتلك دعما تاما للبرمجة غرضية التوجه
و من اكثر ميزاتها فائدة هي الوراثة , كما بمكن ان تكون قيمتها null

النقطة التي اريد التركيز عليها هي التالية :
استخدام Value Types و Reference types كمتحولات
Value Types يمكن ان تمرر بالقيمة او بالمرجع
عندما تمررها بالقيمة فإن نسخة من قيمة المتحول توضع في المكدس (stack)
و بالتالي فن الدالة المستدعية ستتعامل مع نسخة من المتحول و لن تؤثر على قيمة المتحول الأصلية
أما عندما تمررها بالمرجع فإنه يتم وضع مؤشر في المكدس يشير إلى القيمة
و الدالة التي تستدعي المتحول تستطيع ان تغير قيمته
فكرة التمرير بالقيمة و المرجع فكرة معروفة لكثيرين لكن ليس هذا بيت القصيد اكملوا معي
المتحول من نوع reference-type يحتوي على مؤشر يشير للغرض
هنا قد يحصل بعض الارباك
هناك نوعان Value Types و reference-type و هناك طريقتان لتمرير المتحولات
بالقيمة (Value ) و بالمرجع (reference)

لذا قد تكون توقعت انه يجب ان نمرر Value Types بالقيمة (Value ) و reference-type بالمرجع (reference) ؟

الـ Value Types كما ذكرنا تمرر بالقيمة و بالمرجع
أما الـ reference-type فتمرر على نحو مألوف عادة بالقيمة و ليس بالمرجع

السبب هو ان قيمة الـ reference-type هي عبارة عن مؤشر , و بالتالي قيمتها هي القيمة نفسها التي تمرر بين الدوال (و ليس نسخة عنها)
من دون شك يمكنك ان تمرر reference-type بالمرجع لكن هذا يؤدي إلى الحصول على مؤشر لمؤشر , و هذا ما يحص نادرا
و هذه الامكانية تحدث لحالات قليلة كبعض الاستدعاءات لـnative code عند الحاجة

تمام كوجان في 02/03/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: