การใช้งาน Deletgate เบื้องต้น
ครับ delegate น่าจะเป็นประเด็นที่ค่อนข้าง จะสับสน กับ นักพัฒนามือหัดขับ หลาย ๆ ท่าน ( ผมด้วย ) ในบทความนี้ จะพูดถึงการใช้งานแบบ พื้นฐานของ delegate เพื่อ พื้นที่สำคัญก้าวต่อไปของ การใช้ delegate ใน C# .net
Delegate เป็น base type ตัวหนึ่งใน .NET ซึ่งมันเป็น class สำหรับการสร้างและใช้ delegate ในขณะ runtime ครับอย่างที่ทราบกันนะครับโดย พื้นฐานแล้ว Delegate คล้ายกับ Function Pointer ใน C++ ซึ่งใช้ในการอ้างอิง method ต่างกันก็ตรงที่ delegate นั้น method ที่จะใช้อ้างอิง ต้องมี หน้าตาเหมือนกับ delegate type ที่ประกาศไว้ หน้าตาเหมือน ก็คือ มี return type และ parameters เหมือน กัน
มีการให้ข้อมูลเรื่องการใช้งาน delegate มากมาย แต่คำถามที่เกิดขึ้นในใจ เพื่อน ๆ ก็คือ การใช้งาน เราจะใช้งานมันเมื่อไร หรือ ความจำเป็นอะไร ที่จะทำให้เราต้องเอา delegate มาแก้ปัญหา หล่ะ แน่นอนครับ มันต้องมีสิครับ ก็คือว่า ในการพัฒนา Application อาจมีบางครั้งหรือบางเหตุการณ์ที่เราอาจ ต้องแก้ปัญหาด้วยการ ส่งผ่าน method ไปให้ กับ method ตัวอื่น เพื่อใช้งาน ( method , function , procedure คืออันเดียวกันนะครับ) ดังนั้นเราก็สามารถใช้ delegate ในการจัดการกับปัญหานี้ได้
เพื่อให้เห็นภาพ วิธีที่ดีก็คือ ดูจากตัวอย่างครับ ตัวอย่างนี้ยืมมาจาก นี่ครับ http://msdn.microsoft.com/en-us/library/900fyy8e%28v=vs.71%29.aspx
จากภาพ ในขั้นตอนแรก ก็คือการ ประกาศ delegate ชื่อว่า MyDelegate มี parameter ตัว คือ I เป็น integer และ ไม่มี return type คือ กำหนดให้เป็น void
ต่อไป เป็นการ สร้าง function ชื่อว่า DelegateFunction ซึ่งเป็น ฟังก์ชันที่จะให้ delegate object มาใช้ หรือชี้มาที่ function นี้ จะเห็น ว่า มี parameter และ return type เหมือน กับ delegate ที่ประกาศไว้ นะครับ
ต่อไปเป็นการนำไปใช้ ในขั้นตอนที่ 3 เราส่งผ่าน delegate ให้กับ TaskADelegate fucion โดยผ่านเป็น parameter type เป็น delegate ที่ประกาศไว้
และสุดท้าย TaskADelegate function ก็ถูกเรียกใช้ใน public static void Main() จากคำสั่งนี้ TaskADelegate(new MyDelegate(DelegateFuction));
จากคำสั่งที่เห็น รวบรัดไปหน่อยสำหรับ มือใหม่ ขอแตกออกเป็น 2 คำสั่งดังนีครับ
MyDelegate delCall = new MyDelegate(DelegateFunction);
TaskADelegate(delCall);
จะเห็นว่าเหมือนการสร้าง object นะครับ delCall เป็น object ของ MyDelegate และ ชี้ไปที่ DelegatFunction แล้วก็ส่งผ่านไปให้ function TaskADelegate เรียกใช้ งานอีกที หรือ จะเรียก delCall( ตัวเลขใด ๆ ) เหมือนเรียกใช้ function เลยก็ได้ แล้วแต่การใช้งานครับ
ตัวอย่าง ง่าย ๆ ที่แสดงถึงการใช้ประโยชน์ Delegate คือ การที่ 2 delegate นำมา combine กันได้ หรือมารวมกันได้ โดยใช้ operator + หรือ –
รูปนำมาจาก http://msdn.microsoft.com/en-us/library/900fyy8e%28v=vs.71%29.aspx
1 จากรูปตัวอย่าง เราประกาศ delegate ชื่อว่า myDelegate มี parameter ชนิด string และไม่มี return type
2 ใน class ประกาศ method ที่มี signature เดียวกับ delegate มี 2 function คือ Hello และ Goodbye ทั้งสอง พิมพ์ ตัวอักษร ออกหน้าจอ ว่า Hello, “xxx” และ Good bye , “xxx” ตามลำดับ
3 หลังจากนั้นใน function main เราประกาศ ตัวแปร delegate a,b,c,d
– ให้ a point ไป Hello
– ให้ b pointไป Goodbye
– และ c = a + b;
– และ d = c – a;
ผลการ run จะเห็นว่า เมื่อสั่ง c(); จะมี การทำงาน ของ a() ต่อด้วย b()
เช่นเดียวกันกับ d() จะมีแค่ การทำงานของ b() เนื่องจาก ได้ลบ การทำงาน ของ a() ไปแล้ว
สรุปก็คือ instance ของ delegate สามารถนำมา บวกและ ลบกันได้ โดยที่บวก เป็นการเอา function มาทำงานต่อกัน และ – เป็นลบส่วนการทำงานของ function ที่ลบออกไป ครับ เราอาจใช้
c += a; ก็ได้นะครับ นั่นเป็นวิธีการใช้ delegate แบบพื้น นะครับ ในบทความถัดไป จะพูดถึงการใช้งาน ขั้นสูงขึ้นต่อไปนะครับ s_teerapong2000@yahoo.com