tjindapitak
10/3/2017 - 1:38 AM

eventAndDelegateExample.cs

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