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

การเปรียบเทียบ Delegates เมื่อเปรียบ Delegates เป็นถุงที่ใส่เมธอดไว้ข้างใน

สิ่งที่ควรระวัง

  • 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