Console.WriteLine(@"สวัสดีครับ ทุกท่านที่ไม่ได้รออ่าน
แต่มันบังเอิญเห็นมันขึ้นใน Feed พอดี ขอแสดงความยินดีด้วย
เนื่องจากวันนี้ จะได้เห็นโค้ดซะที ๕๕๕๕+ ");
public delegate void MyHandler(); // เขียนบล๊อคด้วยโค้ด แหม อะไรมันจะเท่ห์ขนาดนั้นนนน อุ๊งๆๆ
public class Program
{
public static void Main(string[] args)
{
var p = new Observer(); // Class Observer อยู่ด้านล่าง ใครอ่านด้วยมือถือ ผมขออำภัยอย่างยิ่ง แต่ผมมีทางแก้ให้นะครับ => ซื้อ Ipad
MyHandler mh;
mh += () => { Console.WriteLine("test1"); }; // ยัดกล้วยเข้าไปในเชือก
mh += () => { Console.WriteLine("test2"); }; // ยัดกล้วยอีกแท่ง เข้าไปในเชือก แอร๊ยย~!
p.evt = new MyHandler(mh); // อ๊อดๆ เขียนแบบนี้ไม่ได้
// คุณภรรยาไม่สามารถถูกเขียนทับ หรือล้างสมองได้ .. ยัง!! อย่าเพิ่งหมดหวังครับ ยังพอมีหนทางอยู่
p.evt += new MyHandler(mh); // แบบนี้ได้ครับ บวกเข้าไปเล้ยยยยย ไม่ต้องสนว่า เธอจะมีสามีอยู่แล้วหรือยัง บวกโลดดด
// แต่สังเกตตรงนี้ให้ดีนะจ๊ะ, mh เป็น Delegate ที่เก็บ "สอง" ฟังก์ชัน
p.evt += new MyHandler(() => { Console.WriteLine("test3"); }); // อันนี้ผมไม่ได้ยกตัวอย่างให้ดูก่อนหน้านี้
// เพราะมัวแต่ชักแม่น้ำทั้งแปดอยู่ แต่นี่ล่ะครับ คือวิธีการใส่คุณสามีเข้าไปที่คุณภรรยา
// (ใครกำลังคิดอย่างว่าอยู่ ไม่เอานะครับ อย่าหมกมุ่นเลย หาฟุตบอลเตะบ้าง แฮ่กๆๆ)
p.evt(); // บรรทัดนี้มีปัญหาครับ เพราะว่าเมื่ออยู่นอกบ้าน คุณเรียกภรรยาให้ทำงานแบบนี้ไม่ได้นะครับ เสียใจด้วย
// ถ้าหากคุณยังดึงดันที่จะเรียกเธอให้ลุกมาทำงาน ภรรยาคุณจะโวยวายทันที ว่า
// The event 'Observer.evt' can only appear on the left hand side of += or -=
// (except when used from within the type 'Observer')
// OH MY GOAT เธอร้ายจริงๆเลย แม่กวางน้อย
p.Run(); // แต่เรียกเธอให้ทำงาน ผ่านในบ้านได้ เย่ ... แสดงว่าอยู่บ้าน เรียกตัวเธอมาใช้งานได้เต็มที่ !!
/*
test1
test2
test3
*/
Console.WriteLine(p.GetNumberOfDelegatesInEvent()); // บรรทัดนี้ได้ 2 ทำไมไม่ได้ 3 ?
// ใครรู้คำตอบรบกวนเขียนจดหมายส่งมาหาผมด้วย (ผมยังไม่ได้รัน ต้องรีบไปถูกบ้านก่อน)
}
}
public class Observer {
public event MyHandler evt;
public void Run(){
evt();
}
public int GetNumberOfDelegatesInEvent(){
return evt.GetInvocationList().Count(); // Delegate.GetInvocationList() จะได้ลิสต์ของ Delegate ที่อยู่ในนั้น
}
}
// เอาจริงๆแล้ว คุณภรรยา (Event) ก็ออกแบบมาดีเหมือนกันนะ มีให้ใช้แค่ += หรือไม่ก็ -= แค่นั้นแหละ เพิ่อป้องกันการถูกเขียนทับ จากคนอื่น
// เช่น ผมอยากสร้าง Class ZoomMovieBot เพื่อให้คนมา Subscribe ไว้
// หลังจากที่มีหนังซูมออกใหม่ Class ZoomMovieBot ก็จะรัน Event เพื่อบอกให้ทุกคนรู้ว่า "โอ๊ยย! หนังใหม่มาแล้วเด้อออ !!!"
// เป็นไงครับ ถ้าสถานการณ์นี้ คุณภรรยาสามารถทำหน้าที่ได้ดีเยี่ยมเลยใช่ไหมล่ะ จริงๆแล้วเธอก็เพอร์เฟกต์ระดับนึงแหละ ๕๕๕๕+
// จบแล้วจ้า ... แต่ถ้าใครยังอยากเห็นตัวอย่างของการใช้ Delegate แบบเพียวๆ ไม่ใช้ผ่าน Event
// บอกที่อยู่มาครับ เดี๋ยวผมเอาตัวอย่างไปให้ดูถึงบ้านเลย ปล. ถ้าคุณเป็นผู้ชาย ผมขออนุญาตไม่ว่างนะครับ
// ปล. Dig Deep into Delegate hell part 4 จะมา .. ไม่มาแล้ว จบแล้ว สบายใจได้จ้าาาาาา
// (ภายในวันที่ 2017–10–09)(เพื่อเตือนตัวเอง)(และให้คนอื่นเตือน) จะมีซีรียส์อะไรออกมาอีกนั้น ตดตามได้ที่ redtube.c0m/public/tj