فكرة جميلة لشرطة الشارقة
بشكل فظيع من جراء الحوادث في الساحات العامة و بجانب الحدائق
و ذلك حتى يرى السائقون نتيجة التهور و السرعة الزائدة فيعتبروا بغيرهم
قمت بتصوير احدى هذه السيارات و اليكم المشهد
Posted by tammamkoujan on March 2, 2007
Posted in منوع | 2 Comments »
Posted by tammamkoujan on March 2, 2007
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 عند الحاجة
Posted in برمجة | Leave a Comment »