[[Template core/front/global/updateWarning is throwing an error. This theme may be out of date. Run the support tool in the AdminCP to restore the default theme.]]
ان تطور الكثير من اللغات مثل الـ Ruby والـ Python وكثرة استخدام الجافا سكربت اثارت الكثير من الاهتمام للبرمجة الديناميكية. بدأت السي شارب طريقها إلى "dynamic" في الاصدارات السابقة للدوت نت وذلك من خلال الكلمة المحجوزه var والاجراءات المجهولة anonymous methods
في الإصدار الرابع تم اضافت النوع dynamic, بالرغم من ان السي شارب مازالت لغة statically typed, فتلك الاضافات اعطتها القدرة الديناميكية التي يبحث عنها بعض المطورين
النوع dynamic يسمح لك بكتابة كود يتعدى مرحلة فحص المترجم, بمعنى اخر ان المترجم يفترض ان اي عملية معرفة على الكائن من النوع dynamic صحيحة. فإذا كانت العملية غير صحيحة لايتم اكتشافها إلا في زمن التشغيل, وهذا يتضح في المثال التالي
Calculator calc = GetCalculator(); int sum = calc.Add(12, 25);
في المثال اعلاه لنفترض ان لدينا الاجراء GetCalculator الذي يرجع كائن من نوع Calculator وبالتأكيد سيتعرف المترجم على الاجراء Add داخل الفئة نفسها لوجود فئة CLR ضمن المشروع ,ومن ثم سيتم تمرير الوسيطين 12 و 25 وجمعها وبعدها سيتم ارجاع النتيجة في المتغير sum
لنتخيل عدم وجود فئة CLR في المشروع, فما العمل؟!! فأكيد من خبرتنا في اللغة سيتم كتابة كود باستخدام الـ Reflection على النحو التالي
object calc = GetCalculator(); Type calcType = calc.GetType(); object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, calc, new object[] { 12, 25 }); int sum = Convert.ToInt32(res);
سنلاحظ في المثال اعلاه ان تم تعريف كائن من نوع object ومن ثم تم جلب نوعه عبر الاجراء GetType واخيرا تم استدعاء الاجراء InvokeMember ليتم تمرير اسم الاجراء كنص والمتغيرات التي ستمرر لها, واخيرا تم تحويل المرجع الى نوع صحيح وحفظه في المتغير sum
وهو نفس الحال لو كان الكائن Calculator معرف ضمن الجافاسكربت
ScriptObject calc=GetCalculator(); object res=calc.Invoke("Add",12,25); int sum=Convert.ToInt32(res);
سنلاحظ تم تعريف كائن من نوع ScriptObject ليتم حفظ النوع المرجع من ثم استدعاء الاجراء Add وتمرير وسائطه عبر الاجراء Invoke واخير تحويل الناتج الى نوع صحيح وحفظه في المتغير sum
اما الان تم توحيد جميع الطرق السابقة ليتم معاملة الكائنات الديناميكية بصورة ستاتيكية
dynamic calc = GetCalculator(); int sum = calc.Add(12, 25);
فقد تم تعريف المتغير calc من نوع dynamic والان يمكننا كتابة اي شيء بعد calc. ولقد تم كتابة الاجراء Add بالرغم انه المترجم لن يتنبأ بذلك .. لماذا؟!! لأنه في الاساس لن يتم التعرف على النوع calc الا في زمن التشغيل, وحينها سيقوم المترجم بالتأكد من صحة وجود الاجراء Add وتحويل القيمة اوتوماتيكيا الى نوع صحيح وسيتم فظها في المتغير sum
تم النشر منذ
السلام عليكم ورحمه الله وبركاته
ان تطور الكثير من اللغات مثل الـ Ruby والـ Python وكثرة استخدام الجافا سكربت اثارت الكثير من الاهتمام للبرمجة الديناميكية. بدأت السي شارب طريقها إلى "dynamic" في الاصدارات السابقة للدوت نت وذلك من خلال الكلمة المحجوزه var والاجراءات المجهولة anonymous methods
في الإصدار الرابع تم اضافت النوع dynamic, بالرغم من ان السي شارب مازالت لغة statically typed, فتلك الاضافات اعطتها القدرة الديناميكية التي يبحث عنها بعض المطورين
النوع dynamic يسمح لك بكتابة كود يتعدى مرحلة فحص المترجم, بمعنى اخر ان المترجم يفترض ان اي عملية معرفة على الكائن من النوع dynamic صحيحة. فإذا كانت العملية غير صحيحة لايتم اكتشافها إلا في زمن التشغيل, وهذا يتضح في المثال التالي
في المثال اعلاه لنفترض ان لدينا الاجراء GetCalculator الذي يرجع كائن من نوع Calculator وبالتأكيد سيتعرف المترجم على الاجراء Add داخل الفئة نفسها لوجود فئة CLR ضمن المشروع ,ومن ثم سيتم تمرير الوسيطين 12 و 25 وجمعها وبعدها سيتم ارجاع النتيجة في المتغير sum
لنتخيل عدم وجود فئة CLR في المشروع, فما العمل؟!! فأكيد من خبرتنا في اللغة سيتم كتابة كود باستخدام الـ Reflection على النحو التالي
سنلاحظ في المثال اعلاه ان تم تعريف كائن من نوع object ومن ثم تم جلب نوعه عبر الاجراء GetType واخيرا تم استدعاء الاجراء InvokeMember ليتم تمرير اسم الاجراء كنص والمتغيرات التي ستمرر لها, واخيرا تم تحويل المرجع الى نوع صحيح وحفظه في المتغير sum
وهو نفس الحال لو كان الكائن Calculator معرف ضمن الجافاسكربت
سنلاحظ تم تعريف كائن من نوع ScriptObject ليتم حفظ النوع المرجع من ثم استدعاء الاجراء Add وتمرير وسائطه عبر الاجراء Invoke واخير تحويل الناتج الى نوع صحيح وحفظه في المتغير sum
اما الان تم توحيد جميع الطرق السابقة ليتم معاملة الكائنات الديناميكية بصورة ستاتيكية
فقد تم تعريف المتغير calc من نوع dynamic والان يمكننا كتابة اي شيء بعد calc. ولقد تم كتابة الاجراء Add بالرغم انه المترجم لن يتنبأ بذلك .. لماذا؟!! لأنه في الاساس لن يتم التعرف على النوع calc الا في زمن التشغيل, وحينها سيقوم المترجم بالتأكد من صحة وجود الاجراء Add وتحويل القيمة اوتوماتيكيا الى نوع صحيح وسيتم فظها في المتغير sum
شارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه