Delegate

    บทนี้ต้องตั้งใจมากหน่อยครับเพราะมันค่อนข้างยุ่ง แต่มันสำคัญครับ มันเป็นพื้นฐานที่ object ใช้ส่ง event ข้ามกัน เราเอาเลยนะครับ เอานิยามให้ชัดๆ ก่อน Delegate คือ pointer to function ผมไม่อยากอาจสำนวนแบบ C มาเขียนเลย เอาอย่างนี้ดีกว่า ผมอธิบายว่า Delegate คือการที่เอา function ไปเก็บไว้ในตัวแปร เพื่อว่าให้คุณเรียกที่ใช้ที่ไหนก็ได้ หรือจะส่งเป็น parameter ไปไห้ function อื่นก็ได้ เรามาดูตัวอย่างกันดีกว่า จะได้เข้าใจง่ายขึ้น

สมมุติว่าเรามีสอง function ดังนี้

public static string set_name(string name)
{

  
return "My Name is : " + name;
}

public static string set_surname(string surname)
{
   return "My surname is : " +
surname;
}

มันจะดีไหมถ้าเราสามารถ มีชนิดตัวแปรเช่น SetString แล้วเราใช้มันแบบนี้

 

public static work(SetString x, string str)
{
   string sentence;
   sentence = x(str);
   Console
.WriteLine(sentence);
}

จริงๆ แล้ว x นี้ map function set_name() หรือ  set_surname() ขึ้นอยู่กับผู้ส่ง ตั้งใจอยากให้เป็นอะไร

ทีนี้เรารู้ถึงวิธีการใช้แล้ว เราเหลืออีกสองอย่างที่จำเป็นต้องรู้คือ สร้าง type SetString ได้อย่างไร และ code ตัวเรียกจะเลือกว่าเอา function มาเก็บไว้ในตัวแปร x ทำได้อย่างไร เรามาดูกันทีละข้อ

 

public delegate string SetString(string str);

อันนี้จริงๆ แล้วเป็นที่เข้าใจยากที่สุด และ document ส่วนมากพยายามอธิบายตัวนี้ก่อนผลลัพธ์ก็คืองงครับ ผมเลยกลับจากหางไปหัว เรียนจากผลลัพธ์ก่อน ผมว่าน่าจะเข้าใจง่ายขึ้น syntax นี้เป็นการสร้างชนิดตัวแปรที่ชื่อว่า SetString ครับ มันจะชี้ไปยัง function ใดๆ ก็ได้ที่มี parameter ตัวเดียวที่เป็น string และมี return type เป็น string ด้วย 

จำไว้ให้ดีนะครับ syntax นี้เอาไว้สร้างชนิดตัวแปร SetString ไม่ใช่สร้าง function นะครับ ดู syntax แล้วชวนให้คิดไปทางนั้นจริงๆ

ทีนี้เรามาถึงปัญหาสุดท้ายแล้วว่า เอา function ไปใส่ไว้ในตัวแปร x ได้อย่างไร ก็ทำอย่างนี้ครับ

SetString x = new SetString(set_name);

    เป็นการสร้างตัวแปร x และให้มันเก็บตัว set_name ไว้ เมื่อมีใครเรียกใช้มัน มันก็จะไปเรียกใช้ set_name อันนี้เป็นภาษาชาวบ้านเพื่อให้เข้าใจง่าย แม้ว่ามันจะไม่ถูกต้องร้อยเปอร์เซ็นก็ตาม

ที่นี้เรามาดูรวมข้างบนเป็นโปรแกรมกันจะได้เข้าใจได้ตลอด

 

delegate.cs

using System;


public class TestDelegate
{
	
	public delegate string SetString(string str);
	
	public static string set_name(string name)
	{
		return "My Name is : " + name;
	}
		
	public static string set_surname(string name)
	{
		return "My Surname is : " + name;
	}
	
	
	public static void work(SetString x, string str)
	{
		string sentence;
		sentence = x(str);
		Console.WriteLine(sentence);
	}
	
	public static void Main()
	{
		SetString x = new SetString(set_name);
		work(x, "Supoj");
		
		x = new SetString(set_surname);
		work(x, "Choachaicharoenkul");
	}
}

DOS Prompt

C:\CS>delegate
My name is Supoj
My surname is Choachaicharoenkul

C:\CS>_