
บทที่ 20 Delegates
Delegates คืออะไร
Delegates เป็นตัวแปรประเภท reference type ที่ถูกพัฒนาขึ้นมาสนับสนุนการเขียนโปรแกรมในภาษา C# มันใช้สำหรับในการอ้างถึงข้อมูลอื่น แทนที่จะอ้างถึงออบเจ็ค มันอ้างถึงเมธอดแทน หรือกล่าวอีกนัยหนึ่ง delegates คือพอยน์เตอร์ของเมธอดนั่นเอง
การใช้ delegates นั้นช่วยอำนวนความสะดวกหลายอย่าง เช่น การเลือกเมธอดที่จะทำงานใน run time การนำกลับมาใช้ใหม่ของโค้ด นอกจากนี้ delegates ยังทำให้สามารถส่งเมธอดเป็นพารามิเตอร์ได้ อย่างไรก็ตามปราศจาก delegates เราก็ยังสามารถเรียกใช้เมธอดแบบปกติได้
การใช้ delegates
ต่อไปเราจะมีตัวอย่างสำหรับการประกาศและใช้งาน delegates ในภาษา C#
using System;
class DelegatesExample
{
delegate void MyDelegates();
static void Main(string[] args)
{
MyDelegates de = new MyDelegates(Callback);
de();
de = Callback2;
de();
}
static void Callback () {
Console.WriteLine("Called by Delegate.");
}
static void Callback2()
{
Console.WriteLine("Second method, called by Delegate.");
}
}
ตัวอย่างข้างบน เราได้ประกาศ delegate type ขึ้นมา โดย delegate นี้จะสามารถทำงานได้กับเมธอดที่มีการส่งค่าลกับเป็น void และไม่มีพารามิเตอร์
delegate void MyDelegates();
ในเมธอด Main() เราได้สร้างตัวแปร delegate เพื่อทำมาใช้เมธอดประเภทดังกล่าว และใส่พารามิเตอร์เป็น Callback () สำหรับ delegate constructor ตอนนี้ตัวแปร delegate de อ้างถึงเมธอดดังกล่าว และเราเรียกใช้เมธอด
MyDelegates de = new MyDelegates(Callback);
de();
ต่อมาเราได้กำหนดให้ delegate อ้างไปยังเมธอด Callback2() และเรียกใช้เมธอดอีกครั้ง ในคำสั่ง
de = Callback2;
de();
เพราะว่าเมธอด Callback() และ Callback2() เป็นเมธอดที่มีการส่งกลับเป็น void และไม่มีพารามิเตอร์ ดังนั้นมันจึงสามารถใช้ได้กับ delegate นี้
Called by Delegate.
Second method, called by Delegate.
และนี่เป็นผลลัพธ์ของโปรแกรมในการใช้งานเมธอดกับ delegate
คุณสามารถประกาศ delegate แบบสั้นได้ โดยไม่ต้องใส่เมธอดลงไปใน constructor ซึ่งเป็นอีกวิธีที่จะอำนวยความสะดวกในการเขียนโปรแกรม ยกตัวอย่างเช่น
MyDelegates de = Callback;
Delegates กับพารามิเตอร์และ return
ต่อไปเราจะมาสร้าง delegate กับพารามิเตอร์ เพื่อส่งตัวแปรเข้าไปทำงานในเมธอด เช่นเดียวกันกับเมธอด delegate สามารถส่งค่ากลับ มีประเภทหรือจำนวนของพารามิเตอร์ที่แตกต่างกันได้
using System;
class DelegatesExample2
{
delegate string MyDelegates(string s);
static void Main(string[] args)
{
Person p1 = new Person("Max", "Graham");
MyDelegates de = p1.GreetFirstName;
String name1 = de("Hey");
de = p1.GreetLastName;
String name2 = de("Hi");
Console.WriteLine(name1);
Console.WriteLine(name2);
}
}
class Person {
string firstName;
string lastName;
public Person (string f, string n) {
firstName = f;
lastName = n;
}
public string GreetFirstName (string s) {
return s + " " + firstName;
}
public string GreetLastName(string s) {
return s + " " + lastName;
}
}
เหมือนเมธอด delegate สามารถส่งค่ากลับและมีพารามิเตอร์ ในตัวอย่างเราได้สร้าง delegate ที่มีการส่งค่ากลับเป็น string และมีพารามิเตอร์เป็น string หนึ่งตัว แต่ตอนนี้เราใช้กลับเมธอดของคลาส ในตัวอย่างเราได้ใช้ delegate เรียกใช้เพื่อสร้างประโยคทักทาย ว่าจากชื่อหรือนามสกุล
Hey Max
Hi Graham
และนี่เป็นผลลัพธ์ของโปรแกรม