รายละเอียด

บทที่ 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

และนี่เป็นผลลัพธ์ของโปรแกรม