All pages
Powered by GitBook
1 of 1

Loading...

Delegates

😢 ปัญหา

เวลาที่เราเขียนโค้ด แล้วอยากเก็บข้อมูลต่างๆ เช่น ตัวเลข ตัวอักษร อะไรพวกนี้เราก็สามารถสร้างตัวแปรมาเก็บไว้ได้ง่ายๆใช่ป่ะ ตามโค้ดด้านล่างเลย

แต่ถ้าเราอยากเก็บ Method ไว้ในตัวแปรบ้างล่ะ เราจะทำยังไง?

ข้อแนะนำ เรื่อง delegate ในปัจจุบันเราแทบไม่ได้ยุงกับมันเท่าไหร่อยู่แล้ว เพราะ C# ได้พัฒนาต่อยอดความสามารถเจ้า delegate ออกมาเยอะละ ดังนั้นปรกติเราจะใช้ตัวอื่นแทนนั่นเอง แต่สาเหตุที่ต้องเขียนเรื่องนี้ก็เพราะ เจ้า delegate นี้คือหัวใจหลักของความสามารถอื่นๆที่เราจะเรียกใช้มันยังไงล่ะ

😄 วิธีแก้ปัญหา

ในภาษา C# เรามีตัวที่ชื่อว่า Delegate เอาไว้แก้ปัญหานี้อยู่ ซึ่งการทำงานของมันอธิบายไปตรงนี้เดี๋ยวจะ งง เปล่าๆ ลองไปดูโค้ดจะเข้าใจง่ายกว่า

สมมุติว่าเรามี method อยู่ตัวนึง ตามโค้ดด้านล่าง

แล้วเราอยากจะเก็บมันไว้ในตัวแปรซักตัว สิ่งที่เราต้องทำก็คือ สร้าง delegate ขึ้นมาก่อน โดยการสร้างเจ้าตัวนี้ เราจะต้องบอกว่า method ของเรามี Signature เป็นแบบไหน ซึ่งจาก โค้ดด้านบน เราจะเห็นว่า Signature ของมันคือ

  1. มันมี return type เป็น void

  2. มันไม่รับ parameter อะไรเลย

จากที่ว่ามาเราก็จะสร้างเจ้า delegate ขึ้นมาก่อน ตามนี้

ตรง YOUR_DELEGATE_NAME คือชื่อของ delegate ที่เราสร้างขึ้นมา จะเป็นชื่ออะไรก็ได้ ในตัวอย่างของใช้ชื่อนี้เลยละกันขี้เกียจแก้ละ

ถัดมาเราก็จะสร้างตัวแปร เพื่อเอามาเก็บเจ้า method Saladpuk() ของเรา ดังนั้นก็จะออกมาราวๆนี้

สุดท้ายเราก็จะลองเรียกใช้งานมันดู

ผลลัพท์ Hello world

ถ้าตัวตัว method ของเรารับ parameter หรือมีการส่งค่ากลับเป็นอย่างอื่นที่ไม่ใช้ void แล้วล่ะก็ เจ้าตัว delegate ของเราก็จะต้องมี signature ที่ตรงกับมันด้วยนะถึงจะใช้งานได้

📝 Source Code

🎯 บทสรุป

เจ้าตัวนี้ในปัจจุบันเราไม่ได้ไปยุ่งกับมันเท่าไหร่แล้ว แต่เราต้องเข้าใจมันนิดหน่อย เพราะในเรื่องอื่นๆของ C# ได้ใช้หลักเจ้าตัวนี้เยอะอยู่ เช่นพวก Action, Func, Lambda ในบทถัดไปนั่นเอง

int a = 123;
string b = "saladpuk";
static void Saladpuk()
{
    Console.WriteLine("Hello world");
}
delegate void YOUR_DELEGATE_NAME();
YOUR_DELEGATE_NAME del1 = Saladpuk;
del1();
class Program
{
    delegate void YOUR_DELEGATE_NAME();

    static void Main(string[] args)
    {
        YOUR_DELEGATE_NAME del1 = Saladpuk;
        del1();
    }

    static void Saladpuk()
    {
        Console.WriteLine("Hello world");
    }
}