ผู้เขียนแนวคิดที่ได้รับมอบหมาย: Liang Binyu ตัดตอนมาจาก "C# Beginner Classroom" จะได้รับการเผยแพร่เร็วๆ นี้
[email protected]
http://www.cnblogs.com/BeginnerClassroom
บางครั้งเราจำเป็นต้องใช้ฟังก์ชันเป็นพารามิเตอร์ของฟังก์ชันอื่น จากนั้นเราจำเป็นต้องใช้กลไกการมอบหมาย การมอบหมายเป็นแนวคิดที่อธิบายได้ยาก ผู้เขียนคิดหนักมาหลายวันและในที่สุดก็เกิดตัวอย่างที่แยบยล
ต่อไป เราออกแบบฟังก์ชันการแสดงละครสัตว์ RunCircus() พารามิเตอร์แรกของมันคือฟังก์ชันที่แสดงถึงสัตว์ชนิดใดก็ตามที่ถูกส่งผ่านไปยังสัตว์นั้น การแสดงของสัตว์นั้นจะถูกแสดง โปรดสร้างโครงการใหม่ชื่อ "Delegate" และเพิ่มรหัสต่อไปนี้
ลองดูสิ: การกำหนดผู้รับมอบสิทธิ์
//"ห้องเรียนเริ่มต้น C#"
//ฟังก์ชั่น: การแสดงสุนัข
คงเป็นโมฆะ DogAct (ชื่อสตริง)
-
Console.WriteLine("สวัสดี ฉันชื่อ " + ชื่อ + "!");
Console.WriteLine(@"
-
-
-
-
-
-
-
-
/,สนูปปี้,
// เย็น! \
-
-
-
-
//ฟังก์ชั่น: การแสดงแมว
CatAct เป็นโมฆะคงที่ (ชื่อสตริง)
-
Console.WriteLine("สวัสดี ฉันชื่อ " + ชื่อ + "!");
Console.WriteLine(@"
-
-
-
-
_|. โอ _ โอ |_
-
-
-
//o โอ/
-
-
-
-
//ฟังก์ชั่น: การแสดงสิงโต
โมฆะคงที่ LionAct (ชื่อสตริง)
-
Console.WriteLine("สวัสดี ฉันชื่อ " + ชื่อ + "!");
Console.WriteLine(@"
-
-
,%%%c "" เจ/%%%
% %%%%/ o %%%
-
`%% `%%%%(__Y__)%%'
-
-
-
-
\/ ) |. |
-
-
-
//กำหนดผู้รับมอบสิทธิ์
มอบหมายให้เป็นโมฆะ AnimalAct (ชื่อสตริง);
//ฟังก์ชัน: การแสดงละครสัตว์ (พารามิเตอร์แรกคือตัวแทนประเภท AnimalAct)
คงเป็นโมฆะ RunCircus (AnimalAct animalAct ชื่อสตริง)
-
สัตว์Act(ชื่อ);
-
โมฆะคงที่หลัก (สตริง [] args)
-
//แปลงฟังก์ชัน DogAct() เป็นผู้รับมอบสิทธิ์ประเภท AnimalAct
AnimalAct deleDogAct = AnimalAct ใหม่ (DogAct);
//ส่ง deleDogAct ของผู้รับมอบสิทธิ์ไปยังฟังก์ชัน RunCircus()
RunCircus(deleDogAct, "สนูปปี้");
//แปลงฟังก์ชัน CatAct() ให้เป็นผู้รับมอบสิทธิ์ประเภท AnimalAct แล้วส่งต่อไปยังฟังก์ชัน RunCircus()
RunCircus(New AnimalAct(CatAct), " Kitty ");
-
ผลการวิ่งมีดังนี้:
"คลาสเริ่มต้น C#"
พารามิเตอร์แรกของฟังก์ชัน RunCircus(AnimalAct animalAct, string name) จริงๆ แล้วเป็นฟังก์ชันที่แสดงถึงสัตว์ แต่เพื่อที่จะดำเนินการตรวจสอบประเภทอย่างเข้มงวด เราไม่สามารถส่งชื่อของฟังก์ชันไปให้โดยตรงได้ แต่ควรกำหนดผู้รับมอบสิทธิ์ (Dlelegate) ก่อน นั่นคือ กำหนด "ประเภทฟังก์ชัน"
ผู้รับมอบสิทธิ์ถูกประกาศด้วยคีย์เวิร์ดผู้รับมอบสิทธิ์ ข้อความข้างต้นกำหนดผู้รับมอบสิทธิ์ (ประเภทฟังก์ชัน) ที่เรียกว่า AnimalAct ซึ่งระบุประเภทพารามิเตอร์ของผู้รับมอบสิทธิ์และประเภทค่าส่งคืนอย่างชัดเจน เมื่อเราจำเป็นต้องใช้ฟังก์ชันเป็นพารามิเตอร์ เราต้องแปลงให้เป็นอินสแตนซ์ของผู้รับมอบสิทธิ์ก่อน
อินสแตนซ์ผู้รับมอบสิทธิ์นี้จะถูกส่งผ่านเป็นพารามิเตอร์ไปยังฟังก์ชันที่เรียกใช้
จะเห็นได้ว่าจริง ๆ แล้วอินสแตนซ์ของผู้รับมอบสิทธิ์ deleDogAct เป็นนามแฝงของฟังก์ชัน DogAct() แน่นอนว่าผู้รับมอบสิทธิ์และฟังก์ชันที่ได้รับมอบสิทธิ์ควรมีประเภทพารามิเตอร์และประเภทส่งคืนเดียวกัน
ในโปรแกรมของเรา ละครสัตว์จะเรียกใช้ฟังก์ชัน RunCircus() เพื่อดำเนินการเสมอ เมื่อกำหนดฟังก์ชัน RunCircus() เราไม่ทราบหรือสนใจว่าฟังก์ชันใดที่ผู้รับมอบสิทธิ์ส่งไปให้ฟังก์ชันนี้จะไม่เกิดขึ้นจนกว่าจะมีการเรียกใช้ฟังก์ชัน RunCircus() และส่งพารามิเตอร์จริงไปให้ฟังก์ชันนั้น ไม่ว่าพารามิเตอร์จริงจะถูกส่งผ่านหรือไม่ก็ตาม การแสดงจะดำเนินการ หากคุณผ่านการมอบหมาย deleDogAct คณะละครสัตว์จะแสดงการแสดงของสุนัข หากคุณผ่านการมอบหมาย deleCatAct ละครสัตว์ก็จะแสดงการแสดงของแมว คณะละครสัตว์จะแสดงการแสดงของแมว ดังนั้น ฟังก์ชันที่รับผู้รับมอบสิทธิ์เป็นพารามิเตอร์จึงมีลักษณะทั่วไปบางอย่าง