تعد وظائف رد الاتصال جزءًا مهمًا من برمجة Windows. إذا كانت لديك خلفية برمجة C أو C++، فقد استخدمت عمليات الاسترجاعات في العديد من واجهات برمجة تطبيقات Windows. بعد إضافة الكلمة الأساسية AddressOf إلى VB، يمكن للمطورين والمطورين الاستفادة من واجهات برمجة التطبيقات التي كانت مقيدة في السابق. وظائف رد الاتصال هي في الواقع مؤشرات لاستدعاءات الأساليب، والمعروفة أيضًا باسم مؤشرات الوظائف، وهي ميزة برمجة قوية جدًا. يطبق .NET مفهوم المؤشرات الوظيفية في شكل مفوضين. ما يميزها هو أنه، على عكس مؤشرات دالة C، فإن مندوبي .NET آمنون من حيث النوع. يوضح هذا أن مؤشر الدالة في لغة C هو مجرد مؤشر لوحدة تخزين، ولا يمكننا معرفة ما يشير إليه هذا المؤشر فعليًا، ناهيك عن المعلمات وأنواع الإرجاع. كما هو موضح في هذا الفصل، يعمل مندوبو .NET كعملية آمنة للنوع. أدناه سوف نتعلم كيف يستخدم .NET المفوضين كوسيلة لتنفيذ الأحداث.
1. التكليف
عندما تريد تمرير طريقة إلى طريقة أخرى، تحتاج إلى استخدام المفوض. لفهم ما تعنيه، قم بإلقاء نظرة على الكود التالي:
int i = int.Parse("99");
لقد اعتدنا على تمرير البيانات كمعلمات إلى الأساليب، كما هو موضح في المثال أعلاه. لذا، فإن تمرير طريقة أخرى إلى طريقة يبدو غريبًا بعض الشيء. في بعض الأحيان، لا يتم تنفيذ العملية التي يتم إجراؤها بواسطة إحدى الطرق على البيانات، ولكن على طريقة أخرى أكثر تعقيدًا. لا نعرف ما هي الطريقة الثانية في وقت الترجمة، ولا يمكن الحصول على هذه المعلومات إلا في وقت التشغيل، لذلك نحتاج إلى تمرير الطريقة الثانية كمعلمة إلى الطريقة الأولى، وإليك بعض الأمثلة: :
1. ابدأ سلاسل العمليات ----- في لغة C#، يمكنك إخبار الكمبيوتر بتشغيل تسلسلات تنفيذ جديدة معينة بالتوازي. يسمى هذا التسلسل مؤشر ترابط. استخدم أسلوب Start() على مثيل System.Threading.Thread المتراكم لبدء تنفيذ مؤشر ترابط. إذا كنت تريد أن تطلب من الكمبيوتر أن يبدأ تسلسلاً جديدًا للتنفيذ، فيجب عليك الإشارة إلى المكان الذي سيتم تنفيذ التسلسل فيه. يجب تزويد الكمبيوتر بتفاصيل الطريقة لبدء التنفيذ، أي أن طريقة Thread.Start() يجب أن تأخذ معلمة تحدد الطريقة التي سيتم استدعاؤها بواسطة مؤشر الترابط.
2. فئات المكتبة العامة ------ هناك العديد من المكتبات التي تحتوي على تعليمات برمجية لأداء المهام القياسية المختلفة. هذه المكتبات عادة ما تكون قائمة بذاتها. بهذه الطريقة، عند كتابة المكتبة، ستعرف كيفية تنفيذ المهمة. لكن في بعض الأحيان تحتوي المهام أيضًا على مهام فرعية. فقط رمز العميل الذي يستخدم المكتبة يعرف كيفية تنفيذ هذه المهام الفرعية. على سبيل المثال، اكتب فصلًا يأخذ مصفوفة من الكائنات ويفرزها بترتيب تصاعدي. ومع ذلك، يتضمن جزء من عملية الفرز إعادة استخدام كائنين في المصفوفة، ومقارنتهما لمعرفة أيهما يجب أن يأتي أولاً. إذا كنت تكتب فصلًا دراسيًا يجب أن يكون قادرًا على فرز أي مجموعة من الكائنات، فلن تتمكن من إخبار الكمبيوتر مسبقًا بكيفية مقارنة الكائنات. يجب أيضًا أن يخبر رمز العميل الذي يتعامل مع صفائف الكائنات في الفصل الدراسي الفصل بكيفية مقارنة الكائنات التي سيتم فرزها. بمعنى آخر، يجب أن يمرر رمز العميل تفاصيل معينة إلى الفصل الذي سيجعل ذلك مناسبًا.
3. الأحداث ------ تخطر بشكل عام الكود بالأحداث التي حدثت. تتعلق برمجة واجهة المستخدم الرسومية بشكل أساسي بالتعامل مع الأحداث. عند وقوع حدث ما، يحتاج وقت التشغيل إلى معرفة الطريقة التي يجب تنفيذها. يتطلب هذا تمرير الطريقة التي تتعامل مع الوقت كمعلمة للمفوض. سيتم مناقشة هذه في وقت لاحق.
لقد أنشأنا سابقًا قاعدة مفادها أن أسماء الطرق يتم تمريرها أحيانًا كوسائط لطرق أخرى. ومن الضروري الإشارة أدناه إلى كيفية إكمال هذه العملية. إن أبسط طريقة هي تمرير اسم الطريقة كمعلمة. على سبيل المثال، في مثال مؤشر الترابط السابق، افترض أنه تم بدء مؤشر ترابط جديد وأن هناك طريقة تسمى EntryPoint()، حيث يبدأ تشغيل مؤشر الترابط.
نقطة الدخول باطلة ()
{
// افعل كل ما يحتاج الخيط الجديد إلى القيام به
}
يمكنك أيضًا استخدام الكود التالي لبدء تنفيذ موضوع جديد:
Thread NewThread = new Thread();
Thread.Start(EntryPoint); //خطأ
في الواقع، هذه طريقة بسيطة للغاية، وهي الطريقة المستخدمة في بعض اللغات مثل C وC++ (في C وC++، المعلمة EntryPoint هي مؤشر دالة).
ولكن هذا النهج المباشر يمكن أن يسبب بعض المشاكل، مثل سلامة الكتابة، عند القيام بالبرمجة الموجهة للكائنات، نادرًا ما توجد الأساليب بشكل منفصل، وعادةً ما تحتاج إلى ربطها بمثيل فئة قبل استدعائها. وهذه الطريقة لا تأخذ هذه المسألة بعين الاعتبار. لذا فإن .NET Framework لا يسمح بهذا النهج المباشر من الناحية التركيبية. إذا كنت تريد تمرير أسلوب، فيجب عليك تغليف تفاصيل الأسلوب في نوع جديد من الكائنات، وهو المفوض. المفوضون هم مجرد نوع خاص من الكائنات، والشيء المميز هو أن جميع الكائنات التي حددناها من قبل تحتوي على بيانات، بينما يحتوي المفوضون فقط على تفاصيل الأساليب.
-