المندوبين ، والإجراءات ، و Funcs جميع أنواع Cتركز على مفهوم مشابه: تخزين المراجع في متغير للوظائف والطرق ، والتي يمكن استدعاؤها لاحقًا لتنفيذ الطريقة التي تشير إليها. سنناقش الاختلافات بين الأنواع المختلفة وكيفية استخدامها.
ما هي المندوبين؟
المندوبون هم في الأساس مؤشرات من النوع الآمن للوظائف. المفوض هو مجرد متغير ، يشير إلى طريقة وتنفيذ "مفوض" لها. يمكن تسمية الطريقة التي تشير إليها ، مثل طريقة عضو الفئة ، أو مجهولة ، مثل وظائف الأسهم.
يتكون المندوبون من جزأين رئيسيين: تعريف النوع والتنفيذ. يضمن تعريف النوع أمان النوع ، لذلك إذا كنت تريد فقط قبول طريقة تأخذ سلسلة
وترجع منطقيًا ، فستحتاج إلى تعريفها كدالة عادية ، ما عدا مع
مندوبمعلمة ولا يوجد رمز فعلي.
بعد ذلك ، يمكنك كتابة تنفيذ ، أو العديد من التطبيقات ، والتي لها نفس معاملات الإرجاع والإدخال ، ولكن في الواقع تحتوي على كود فيها.

بعد ذلك ، يمكنك استخدام تعريف المفوض مثل معلمة النوع ، مما يجعل متغيرًا جديدًا يشير إلى الوظيفة الحقيقية. عندما تريد استدعاء المفوض ، يمكنك استدعائه كعملية ، وتمريره المعلمات المناسبة. سوف يبحث وقت تشغيل. NET في الطريقة التي يشير إليها المفوض ، ويستدعي هذه الطريقة.

من الواضح بالفعل أين يكون هذا مفيدًا تمامًا - إذا كان لديك وظائف متعددة تأخذ جميعها نفس معلمات الإدخال ولكن تحتاج إلى استدعاء إصدارات مختلفة بناءً على ، على سبيل المثال ، تعداد الإدخال ، يمكنك تعيين كل قيمة تعداد مندوب ، واستخدم ذلك بدلاً من تكرار المنطق في بيان تبديل كبير.
لا يحتاج المندوبون إلى الإشارة إلى الأساليب المسماة رغم ذلك ، لأنها أكثر فائدة عند الإشارة إلى وظائف مجهولة. يتم إنشاؤها باستخدام صيغة دالة السهم ،
()=> {}، والتي تحدد وظيفة بدون اسم ، ومن ثم "مجهول". يمكنك استخدام هؤلاء تمامًا مثل المندوبين العاديين.

Actions and Funcs هي مجرد مفوضين مع وسيطات محددة ومعلمات إرجاع. يمكن أن تأخذ الإجراءات أي قدر من الوسائط ولكنها تُرجع
void. يمكن أن تأخذ Funcs أي قدر من الوسيطات ، لكنها تُرجع دائمًا قيمة محددة بواسطة معلمة النوع الأخير.
حقًا ، هذه مجرد تعريفات مفوضين معدة مسبقًا من النوع العام
T
.
Action
بدون أي أنواع هو حرفيا مجرد تعريف مفوض فارغ مع نوع إرجاع
void.

ربما تكون قد استخدمت Funcs كثيرًا دون التفكير في الأمر. إنها الوظائف التي تمررها إلى الاستعلامات المعدودة مثل
Where ()
لتحديد العناصر. يشار إلى هذه الأنواع من Funcs على وجه الخصوص بالمسندات ، و
Predicate
مكافئ وظيفيًا لكتابة
Funcفهي ليست مميزة حقًا بخلاف امتلاكها اسم محدد رغم ذلك.
يمكنك في الواقع تعريف
Func
بدقة ، وتعيين وظيفة لها كقيمة ، وتمريرها إلى
. حيث ()، الذي يبدو مزعجًا بشكل غريب نظرًا لأنك تفعل ذلك عادةً بشكل مضمّن بدون النوع أو تعريف المتغير ، لكنه صالح تمامًا:

يمكنك تحديد
بشكل صارم
بدلاً من
Func<int ، bool، لكن بعض الوظائف تريد على وجه التحديد واحدة أو أخرى ، وليس هناك التحويل الضمني بين الاثنين للأسف
لدى المندوبين بعض الخصائص الأخرى المثيرة للاهتمام. نظرًا لأنها مجرد متغيرات ، يمكنك تخزينها في قوائم وقواميس مثل أي نوع مرجعي آخر. يمكنك تكرار جميع المندوبين في القائمة ، واستدعاء كل واحد بدوره.
يمكنك أيضًا إرسال المندوبين ، وهو مصطلح خيالي للقول إنه يمكنك إضافتهم معًا. على سبيل المثال ، في المثال التالي ، يتم تعريف مفوض الترحيب ، والذي يأخذ اسمًا ويحيي المستخدم. تم تحديد تطبيقين ،
Hello
التي تقول مرحبًا ، و
وداعًاتقول وداعًا.

بعد ذلك ، يمكنك حرفياً إضافتها مع عامل علامة الجمع ، على الرغم من ملاحظة أن هذا يتوقع مفوضًا ، وليس مجموعة طريقة ، لذلك تحتاج إلى لف اسم الوظيفة بـ
مندوب جديد ليعمل بشكل صحيح. هذا المفوض المشترك ينفذ كلا العنصرين بالترتيب الذي تمت إضافتهما بهما.

يمكنك طرح المفوضين ، مما يزيلهم من القائمة ، على الرغم من عدم وجود عوامل الضرب لسبب ما ، ولن يكون للقسمة أي معنى هنا.