Delegates
ปภาดา คันธะโน 650710985
1. Delegates คืออะไร?
Delegates เป็นตัวแปรประเภท reference type ที่อ้างอิงถึง method ซึ่งมีความปลอดภัยสูงเพราะมีการตรวจสอบชนิดข้อมูล มันจะช่วยเลือก method ที่จะทำงานใน runtime
Delegates ทำงานคล้ายๆ Pointer ในภาษา C หรือ C++ แต่ต่างจาก Pointer ตรงที่ Pointer จะเป็นตัวชี้ data types แต่ Delegate จะเป็นตัวชี้ Method แทน
2. การประกาศ Delegates
Delegates ประกาศโดยใช้ Keyword delegate เมื่อประกาศแล้ว Delegate สามารถอ้างอิงถึง method ที่มี signature เดียวกับ delegate นั้น ซึ่งประกอบไปด้วย return type และ parameter-list
public delegate int Paphada (int money)
จากโค้ดมีการสร้าง Delegate ชื่อว่า Paphada
ที่มี Return type เป็น int และมี Parameter 1 ตัว คือ int money
3. ตัวอย่างโค้ดที่ใช้ Delegates ในภาษา C#
using System;
public class Paphada
{
private int money = 1000;
public delegate void payDelegate(int amount);
public void Deposit(int amount){
money += amount;
Console.WriteLine("เก็บตังเข้าบัญชี: " + amount + " บาท");
}
public void Withdraw(int amount){
if (money < amount){
Console.WriteLine("เงินไม่พอค่า ใช้เยอะเกิน ถอนออกได้แค่ " + money + " บาท");
money = 0;
Console.WriteLine("หมดตัวแล้วค่า ช่วยล่วย");
}
else{
money -= amount;
Console.WriteLine("ถอนเงิน: " + amount + " บาท");
}
}
public int getMoney(){
return money;
}
public static void Main(string[] args){
Paphada paphada = new Paphada();
payDelegate p = new payDelegate(paphada.Deposit);
p(200);
Console.WriteLine("ปภาดาเหลือตัง " + paphada.getMoney() + " บาท");
p = new payDelegate(paphada.Withdraw);
p(1500);
Console.WriteLine("ปภาดาเหลือตัง " + paphada.getMoney() + " บาท");
}
}
จากโค้ด จะเห็นได้ว่า จะมีการใช้ Delegates ตรงบรรทัดที่ 7 ซึ่งใช้ทำหน้าที่เป็น ตัวเรียกเมธอด deposit(int money)
กับ withdraw(int money)
สังเกตได้จาก void main()
บรรทัดที่ 39 มีการชี้ delegate ไปที่ deposit
ส่วนในบรรทัดที่ 44 เปลี่ยนตัวชี้ delegate ไปที่ withdraw
แทน
4. การเปรียบเทียบการใช้ Delegates ในภาษา C# กับภาษาอื่นๆ
using System;
public class Paphada
{
private int money = 1000;
public delegate void payDelegate(int amount);
public void Deposit(int amount){
money += amount;
Console.WriteLine("เก็บตังเข้าบัญชี: " + amount + " บาท");
}
public void Withdraw(int amount){
if (money < amount){
Console.WriteLine("เงินไม่พอค่า ใช้เยอะเกิน ถอนออกได้แค่ " + money + " บาท");
money = 0;
Console.WriteLine("หมดตัวแล้วค่า ช่วยล่วย");
}
else{
money -= amount;
Console.WriteLine("ถอนเงิน: " + amount + " บาท");
}
}
public int getMoney(){
return money;
}
public static void Main(string[] args){
Paphada paphada = new Paphada();
payDelegate p = new payDelegate(paphada.Deposit);
p(200);
Console.WriteLine("ปภาดาเหลือตัง " + paphada.getMoney() + " บาท");
p = new payDelegate(paphada.withdraw);
p(1500);
Console.WriteLine("ปภาดาเหลือตัง " + paphada.getMoney() + " บาท");
}
}
เมื่อสังเกตจากโค้ดแต่ละภาษาในการใช้ Delegates นั้นมีความแตกต่างกันอย่างมากเพราะภาษาส่วนใหญ่ไม่มีการใช้ Delegate โดยตรง
Java : ใช้ interfaces และ Method Reference แทน ทำให้มีความคล้ายกับ Delegates
Python: ใช้ฟังก์ชันเป็นตัวแปรแทน การใช้ Delegates
C: ใช้ function pointers แทน Delegates ซึ่งมีความซับซ้อนมากกว่า
5. Multicasting of a Delegates
Multicasting ของ Delegates เป็นการขยายจาก Delegates ปกติ ชี้ไปยังหลาย Method ในครั้งเดียว
Multicasting ของ Delegates : Delegates จะถูกรวมเข้าด้วยกัน และเมื่อเรียก delegate จะใช้งานเมธอดทั้งหมดที่รวมเข้าไป
การเรียกใช้ตามลำดับ : ฟังก์ชันทั้งหมดจะถูกเรียกตามลำดับแบบ First in First Out (FIFO)
การเพิ่ม Methods : ใช้เครื่องหมาย + หรือ += เพื่อเพิ่ม Method ลงใน delegate
การลบ Methods : ใช้เครื่องหมาย – หรือ -= เพื่อลบ Method ออกจาก delegate

สิ่งที่ควรระวัง
multicasting ของ delegates ต้องมีการคืนค่าเป็น Void ไม่งั้นจะเกิด error runtime exception
multicasting ของ delegates จะคืนค่าจาก Method สุดท้ายที่ถูกเพิ่มลงใน multicast เท่านั้น แม้ว่า Method อื่น ๆ จะถูกเรียกใช้สำเร็จ
โค้ดตัวอย่าง การใช้ Multicasting ของ Delegates
using System;
public class Paphada
{
private int money = 1000;
public delegate void PayDelegate(int amount);
public void Deposit(int amount)
{
money += amount;
Console.WriteLine("เก็บตังเข้าบัญชี " + amount + " บาท");
}
public void Withdraw(int amount)
{
if (money < amount)
{
Console.WriteLine("เงินไม่พอค่า ใช้เยอะเกิน ถอนออกได้แค่ " + money + " บาท");
money = 0;
Console.WriteLine("หมดตัวแล้วค่า ช่วยล่วย");
}
else
{
money -= amount;
Console.WriteLine("ถอนเงิน " + amount + " บาท");
}
}
public int GetMoney()
{
return money;
}
public static void Main(string[] args)
{
Paphada paphada = new Paphada();
PayDelegate pay = new PayDelegate(paphada.Deposit);
Console.WriteLine("เริ่มต้น:");
Console.WriteLine("ปภาดาเหลือตัง " + paphada.GetMoney() + " บาท");
Console.WriteLine();
pay += paphada.Withdraw;
pay(200);
Console.WriteLine("ปภาดาเหลือตัง " + paphada.GetMoney() + " บาท");
Console.WriteLine();
pay -= paphada.Withdraw;
pay(1500);
Console.WriteLine("ปภาดาเหลือตัง " + paphada.GetMoney() + " บาท");
Console.WriteLine();
}
}
จากโค้ดจะเห็นได้ว่า บรรทัดที่ 43 pay += paphada.Withdraw;
เป็นการใช้ Multicasting แบบบวกเมธอด Withdraw(amount)
เข้าไปจึงทำให้ pay ที่เป็น delegate นั้นมีสองเมธอดคือทำ Deposit(amount)
ก่อนละค่อยทำ Withdraw(amount)
ต่อมาบรรทัดที่ 49 มีการใช้ Multicasting แบบลบเมธอด Withdraw(amount)
ออก pay ในตอนนี้จึงมีแค่เมธอด Deposit(amount)
เท่านั้น
Slide Presentation
Video Presentation
Reference
Sharkar, S. (2023, January 10). Importance of delegation in Python - AnyMind Group - Medium. Medium. https://medium.com/anymind-group/importance-of-delegation-in-python-20c3160c93ab
ใช้เพื่อศึกษาการเขียนโค้ด และ Syntax ของ delegate ในภาษา Python
Java delegates? (n.d.). Stack Overflow. https://stackoverflow.com/questions/44912/java-delegates
ใช้เพื่อศึกษาการเขียนโค้ด และ Syntax ของ delegate ในภาษา Java
GeeksforGeeks. (2021, August 2). C# | Delegates. GeeksforGeeks. https://www.geeksforgeeks.org/c-sharp-delegates/
ใช้เพื่อศึกษา ความหมาย และ การ Multicasting ของ Delegate ใน C#
BillWagner. (2022, September 29). Delegates - C#. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/
ใช้เพื่อศึกษา ความหมาย และ Syntax ของ Delegate ใน C#
C# - delegates. (n.d.). https://www.tutorialspoint.com/csharp/csharp_delegates.htm
ใช้เพื่อศึกษา Syntax ในการเขียน Multicasting ของ Delegate ใน C#
Last updated