مؤلف المفهوم المفوض: Liang Binyu سيتم نشر مقتطفات من "C# Beginner Classroom" قريبًا
المبتدئين [email protected]
http://www.cnblogs.com/BeginnerClassroom
في بعض الأحيان نحتاج إلى استخدام وظيفة كمعلمة لوظيفة أخرى، ثم نحتاج إلى استخدام آلية التفويض. إن التفويض مفهوم يصعب شرحه بوضوح. لقد فكر المؤلف مليًا لعدة أيام وتوصل في النهاية إلى مثال بارع.
بعد ذلك، نقوم بتصميم وظيفة أداء السيرك ()RunCircus. المعلمة الأولى الخاصة بها هي وظيفة تمثل حيوانًا، مهما كان الحيوان الذي يتم تمريره إليه، فسيتم تنفيذ أداء هذا الحيوان. الرجاء إنشاء مشروع جديد باسم "Delegate" وإضافة الكود التالي.
جربها: تعريف المندوبين
//"الفصول الدراسية للمبتدئين في لغة C#"
// الوظيفة: عرض الكلب
DogAct باطل ثابت (اسم السلسلة)
{
Console.WriteLine("مرحبًا، أنا " + name + "!");
Console.WriteLine(@"
.----.
_.'__'.
.--(#)(##)---/#
.' @ /###
: , #####
`-..__.-' _.-###/
`;_: ``'
.''''''''.
/،سنوبي،
// رائع! \
`-.________.-'
___`.
(______|______)");
}
// الوظيفة: عرض القطط
CatAct باطل ثابت (اسم السلسلة)
{
Console.WriteLine("مرحبًا، أنا " + name + "!");
Console.WriteLine(@"
.-. __ _ .-.
|. ` / |
/ '.()--
|.'._/
_|.
= '-' /=
'-.______.-'
/`/___/`
///س/
(_| |_)
|____،____|
(____|____)");
}
// الوظيفة: عرض الأسد
LionAct باطل ثابت (اسم السلسلة)
{
Console.WriteLine("مرحبًا، أنا " + name + "!");
Console.WriteLine(@"
,%%%%%%%%,
,%%/%%%%/%%
,%%%c "" J/%%%
%%%%/ أو %%%.
`%%%% _ |%%%.
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( / `%%%%%%%'
\ .'
\ / |
\/ ) |
/_ |__
(____________))))))))");
}
// تعريف المندوب
مندوب void AnimalAct(string name);
// الوظيفة: أداء السيرك (المعلمة الأولى هي مفوض نوع AnimalAct)
RunCircus باطل ثابت (AnimalAct AnimalAct، اسم السلسلة)
{
AnimalAct(name);
}
الفراغ الثابت الرئيسي (سلسلة [] الحجج)
{
// تحويل الدالة DogAct () إلى نوع AnimalActتفويض
AnimalAct deleDogAct = new AnimalAct(DogAct);
// قم بتمرير المفوض deleDogAct إلى الوظيفة RunCircus ()
RunCircus(deleDogAct, "Snoopy");
// تحويل الدالة CatAct () إلى مفوض نوع AnimalAct وتمريرها إلى الدالة RunCircus ()
RunCircus(new AnimalAct(CatAct), "Kitty");
}
نتائج التشغيل هي كما يلي:
"فئة المبتدئين C#"
المعلمة الأولى للوظيفة RunCircus (AnimalAct AnimalAct، string name) هي في الواقع دالة تمثل حيوانًا. أي نوع من الوظائف يتم تمريره إليها سيستخدم نوع الحيوان الذي سيتم تنفيذه. ولكن من أجل إجراء فحص صارم للنوع، لا يمكننا تمرير اسم الوظيفة إليها مباشرة، ولكن يجب أولاً تعريف المفوض (Dlelegate)، أي تحديد "نوع الوظيفة".
يتم الإعلان عن المفوض باستخدام الكلمة الأساسية المفوض. يحدد البيان أعلاه مفوضًا (نوع الوظيفة) يسمى AnimalAct، والذي يحدد بوضوح نوع معلمة المفوض ونوع قيمة الإرجاع. عندما نحتاج إلى استخدام دالة كمعلمة، يجب علينا أولاً تحويلها إلى نسخة مفوضة.
يتم بعد ذلك تمرير مثيل المفوض هذا كمعلمة إلى الوظيفة التي تستدعيه.
يمكن ملاحظة أن مثيل المفوض deleDogAct هو في الواقع اسم مستعار للوظيفة DogAct(). ومن الواضح أن المفوض والوظيفة المفوضة يجب أن يكون لهما نفس نوع المعلمة ونوع الإرجاع.
في برنامجنا، يستدعي السيرك دائمًا الدالة RunCircus() لأداءها. عند تعريف الدالة RunCircus()، لا نعرف أو نهتم بالوظيفة التي يمثلها المفوض إليها. لا تتحقق هذه الوظيفة حتى يتم استدعاء الدالة RunCircus() وتمرير المعلمات الفعلية إليها. مهما كانت المعلمات الفعلية التي تم تمريرها إليها، فسيتم تنفيذ الأداء إذا قمت بتمرير تفويض deleDogAct، فسيقوم السيرك بأداء أداء الكلب؛ بعد وفد deleLionAct، سيقوم السيرك بأداء عرض للقطط. ولذلك، فإن الوظائف التي تأخذ المفوضين كمعلمات لها عمومية معينة.